2014-02-19 1 views
4

Sitecore 7의 검색 색인을 제한하여 콘텐츠 트리의 한 노드 만 검색하려고합니다.Sitecore 7 검색 색인 문제

현재 구조는 다음과 같습니다

  • sitecore
    • 내용
      • BaseNode
      • $ 회사 노드

색인 색인은 모두 BaseNode & $Company Node입니다. 단 색인 번호는 $Company Node입니다.

나는 Sitecore.ContentSearch.config, SitecoreContentSearch.Lucene.DefaultIndexConfiguration.config, Sitecore.ContentSearch.Lucene.Index.MasterSitecore.ContentSearch.LuceneIndex.Web.config의 기본 /sitecore/content 경로를 업데이트했습니다. <root> 요소가 /sitecore/content/$CompanyNode을 가리 키도록 업데이트 한 경우 색인을 다시 작성하려고 할 때 다음 예외가 발생합니다.

Lucene이 일부 항목 만 색인화하도록 제한하려면 어떻게해야합니까?

Exception: System.Reflection.TargetInvocationException 
Message: Exception has been thrown by the target of an invocation. 
Source: mscorlib 
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature   sig, Boolean constructor) 
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[]  parameters, Object[] arguments) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr,  Binder binder, Object[] parameters, CultureInfo culture) 
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
at Sitecore.Configuration.Factory.AssignProperties(Object obj, Object[] properties) 
at Sitecore.Configuration.Factory.AssignProperties(XmlNode configNode, String[]  parameters, Object obj, Boolean assert, Boolean deferred, IFactoryHelper helper) 
at Sitecore.Configuration.Factory.CreateObject(XmlNode configNode, String[] parameters,  Boolean assert, IFactoryHelper helper) 
at Sitecore.Configuration.Factory.GetInnerObject(XmlNode paramNode, String[] parameters,  Boolean assert) 
at Sitecore.Configuration.Factory.AssignProperties(XmlNode configNode, String[] parameters, Object obj, Boolean assert, Boolean deferred, IFactoryHelper helper) 
at Sitecore.Configuration.Factory.CreateObject(XmlNode configNode, String[] parameters, Boolean assert, IFactoryHelper helper) 
at Sitecore.Configuration.Factory.CreateObject(String configPath, String[] parameters, Boolean assert) 
at Sitecore.Search.SearchManager.get_SearchConfiguration() 
at Sitecore.Shell.Applications.Search.RebuildSearchIndex.RebuildSearchIndexForm.GetIndexes() 
at Sitecore.Shell.Applications.Search.RebuildSearchIndex.RebuildSearchIndexForm.BuildIndexes() 

Nested Exception 

Exception: System.InvalidOperationException 
Message: Root item is not defined 
Source: Sitecore.Kernel 
at Sitecore.Diagnostics.Assert.IsNotNull(Object value, String message) 
at Sitecore.Search.Crawlers.DatabaseCrawler.Initialize(Index index) 
at Sitecore.Search.Index.AddCrawler(ICrawler crawler) 
+0

정답을 표시하거나 자세한 정보를 제공해주십시오. :) –

+0

안녕하세요 앤드류, 더 많은 정보를 수집하기 위해 다른 리소스를 사용하고 있습니다. 우리가 당신의 솔루션을 구현할 것이라고 생각하지만, 지금이 작업은 '대기중인'작업 목록에 머물러 있습니다. –

답변

7

마스터 Lucene 색인 파일을 수정하려고합니다. 결국 많은 것들을 망칠 것이라고 생각합니다. 새로운 Lucene Index 파일을 만드는 것이 좋습니다.

새 색인 생성한다면 : 당신이 검색 크롤러를 설정 폴더

Sitecore.ContentSearch.Lucene.Index.Alexander.config

그 설정에서

을 포함하여 App_Config /에 놓고이 인덱스를 귀하의 노드.

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
    <contentSearch> 
    <configuration type="Sitecore.ContentSearch.LuceneProvider.LuceneSearchConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
     <indexes hint="list:AddIndex"> 
     <index id="alexander_search_index" type="Sitecore.ContentSearch.LuceneProvider.LuceneIndex, Sitecore.ContentSearch.LuceneProvider"> 
     <param desc="name">$(id)</param> 
     <param desc="folder">$(id)</param> 
     <!-- This initializes index property store. Id has to be set to the index id --> 
     <param desc="propertyStore" ref="contentSearch/databasePropertyStore" param1="$(id)" /> 
     <strategies hint="list:AddStrategy"> 
      <!-- NOTE: order of these is controls the execution order --> 
      <strategy ref="contentSearch/indexUpdateStrategies/onPublishEndAsync" /> 
     </strategies> 
     <commitPolicy hint="raw:SetCommitPolicy"> 
      <policy type="Sitecore.ContentSearch.TimeIntervalCommitPolicy, Sitecore.ContentSearch" /> 
     </commitPolicy> 
     <commitPolicyExecutor hint="raw:SetCommitPolicyExecutor"> 
      <policyExecutor type="Sitecore.ContentSearch.CommitPolicyExecutor, Sitecore.ContentSearch" /> 
     </commitPolicyExecutor> 
     <locations hint="list:AddCrawler"> 
      <crawler type="Sitecore.ContentSearch.LuceneProvider.Crawlers.DefaultCrawler, Sitecore.ContentSearch.LuceneProvider"> 
      <Database>web</Database> 
      <Root>/sitecore/content/$Company Node</Root> 
      </crawler> 
     </locations> 
     </index> 
    </indexes> 
    </configuration> 
    </contentSearch> 
</sitecore> 
</configuration> 

위의 색인은 해당 노드 아래의 모든 색인을 생성합니다. C#에서는 이것을 쉽게 호출 할 수 있습니다.

ContentSearchManager.GetIndex("alexander_search_index").Rebuild(); 

using (var searchContext = ContentSearchManager.GetIndex("alexander_search_index").CreateSearchContext()) 
    { 
     var result = searchContext.GetQueryable<SearchResultItem>() 
      .Where(//Put Query Here); 

     //do ForEach if you return multiple and so on. 

     if (result != null) 
       Context.Item = result.GetItem(); 
    } 

또한 인덱스를 재 구축하고 그들이 Sitecore로 이동하여 작동하고 있는지 확인할 수 있습니다 -> 제어판 -> 인덱싱 -> 인덱싱 관리자. 그런 다음 색인을보아야합니다.

다른 편집 : 콘텐츠 트리에서 해당 항목 아래에 C# 검색을 수행하고 웹 데이터베이스 만 사용할 수도 있습니다.

Item bucketItem = //Code to get $Company Node as a Sitecore Item 
    //Probably Sitecore.Context.Database.GetItem("Guid for $Company Node") 

using (var searchContext = ContentSearchManager.GetIndex(bucketItem as  IIndexable).CreateSearchContext()) 
    { 
    try 
    { 
      var result = searchContext.GetQueryable<SearchResultItem>().Where(x => x.Name == itemName).FirstOrDefault(); 
      if (result != null) 
       Context.Item = result.GetItem(); 
    } 
    catch (Exception) 
    { 
     //Do something 
    } 
    }