c# - Sitecore 7 搜索索引问题

标签 c# .net sitecore lucene.net sitecore7

我想将 Sitecore 7 中的搜索索引限制为仅扫描内容树的一个节点。

目前的结构是这样的:

  • 网站核心
    • 内容
      • 基节点
      • $公司节点

索引正在索引 BaseNode & $Company Node , 但我只希望它索引 $Company Node .

我已经更新了默认的 /sitecore/content Sitecore.ContentSearch.config 中的路径, SitecoreContentSearch.Lucene.DefaultIndexConfiguration.config , Sitecore.ContentSearch.Lucene.Index.Master , 和 Sitecore.ContentSearch.LuceneIndex.Web.config .当我更新 <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) 

最佳答案

我相信您正试图修改 Master Lucene 索引文件。我相信这最终会破坏很多东西,我建议您创建一个新的 Lucene 索引文件。

如果您要创建一个新索引:将此索引放在您的 App_Config/Include 文件夹中

Sitecore.ContentSearch.Lucene.Index.Alexander.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# 搜索,并仅使用 Web 数据库。

 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
     }
  }

关于c# - Sitecore 7 搜索索引问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21892353/

相关文章:

asp.net - 为 Sitecore 配置故障转移合作伙伴

c# - 带有 TextBox 的 CheckedListBox 过滤器

javascript - ASP.NET MVC 保存到客户端上的特定文件夹

c# - 如何在 linq 中将空列表视为空列表?

c# - 在 C# MVC 中验证枚举值。发生部分验证 - 如何更改验证行为?

c# - 这个的正则表达式是什么?

c# - mvvm 中的组合框绑定(bind)

Sitecore.ContentSearch 按字段值搜索

c# - Excel 中的范围.替换

sitecore - Sitecore 体验配置文件中没有数据