2014-04-17 18 views
2

我已经为我们的应用程序实现了一个索引,该索引应该从主数据库上的项目存储区索引项目,但似乎每次更新和保存项目(未发布,由于索引在master上运行)会为该项目创建一个附加索引,这意味着该项目的另一个搜索结果。
重新生成索引后,似乎没有问题,存储区中的每个项目都只被索引一次。 我添加索引配置为下面的搜索功能:Sitecore ContentSearch在保存项目时重复索引

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> 
<sitecore> 
    <customSearchNewsItem> 
     <Configuration type="Sitecore.ContentSearch.LuceneProvider.LuceneIndexConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
      <IndexAllFields>true</IndexAllFields> 
      <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch"> 
       <!-- Add fields to the Default Index Configuration --> 
       <fieldNames hint="raw:AddFieldByFieldName"> 
        <fieldType fieldName="_rendering" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" type="Sitecore.SharedSource.Search.DynamicFields.RenderingField,Sitecore.SharedSource.Search" 
         settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 
     <field fieldName="category" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 
       </fieldNames> 
      </fieldMap> 
      <indexFieldStorageValueFormatter type="Sitecore.ContentSearch.LuceneProvider.Converters.LuceneIndexFieldStorageValueFormatter, Sitecore.ContentSearch.LuceneProvider"> 
       <converters hint="raw:AddConverter"> 
        <converter handlesType="System.Guid"               typeConverter="Sitecore.ContentSearch.Converters.IndexFieldGuidValueConverter, Sitecore.ContentSearch" /> 
        <converter handlesType="Sitecore.Data.ID, Sitecore.Kernel"         typeConverter="Sitecore.ContentSearch.Converters.IndexFieldIDValueConverter, Sitecore.ContentSearch" /> 
        <converter handlesType="Sitecore.Data.ShortID, Sitecore.Kernel"        typeConverter="Sitecore.ContentSearch.Converters.IndexFieldShortIDValueConverter, Sitecore.ContentSearch" /> 
        <converter handlesType="System.Boolean"              typeConverter="Sitecore.ContentSearch.LuceneProvider.Converters.IndexFieldBooleanValueConverter, Sitecore.ContentSearch.LuceneProvider" /> 
        <converter handlesType="System.DateTime"              typeConverter="Sitecore.ContentSearch.LuceneProvider.Converters.IndexFieldDateTimeValueConverter, Sitecore.ContentSearch.LuceneProvider" /> 
        <converter handlesType="System.DateTimeOffset"            typeConverter="Sitecore.ContentSearch.Converters.IndexFieldDateTimeOffsetValueConverter, Sitecore.ContentSearch" /> 
        <converter handlesType="System.TimeSpan"              typeConverter="Sitecore.ContentSearch.Converters.IndexFieldTimeSpanValueConverter, Sitecore.ContentSearch" /> 
        <converter handlesType="Sitecore.ContentSearch.SitecoreItemId, Sitecore.ContentSearch"  typeConverter="Sitecore.ContentSearch.Converters.IndexFieldSitecoreItemIDValueConvertor, Sitecore.ContentSearch"> 
         <param type="Sitecore.ContentSearch.Converters.IndexFieldIDValueConverter, Sitecore.ContentSearch"/> 
        </converter> 
        <converter handlesType="Sitecore.ContentSearch.SitecoreItemUniqueId, Sitecore.ContentSearch" typeConverter="Sitecore.ContentSearch.Converters.IndexFieldSitecoreItemUniqueIDValueConverter, Sitecore.ContentSearch"> 
         <param type="Sitecore.ContentSearch.Converters.IndexFieldItemUriValueConverter, Sitecore.ContentSearch"/> 
        </converter> 
        <converter handlesType="Sitecore.Data.ItemUri, Sitecore.Kernel"        typeConverter="Sitecore.ContentSearch.Converters.IndexFieldItemUriValueConverter, Sitecore.ContentSearch" /> 
        <converter handlesType="Sitecore.Globalization.Language, Sitecore.Kernel"      typeConverter="Sitecore.ContentSearch.Converters.IndexFieldLanguageValueConverter, Sitecore.ContentSearch" /> 
        <converter handlesType="System.Globalization.CultureInfo"          typeConverter="Sitecore.ContentSearch.Converters.IndexFieldCultureInfoValueConverter, Sitecore.ContentSearch" /> 
        <converter handlesType="Sitecore.Data.Version, Sitecore.Kernel"        typeConverter="Sitecore.ContentSearch.Converters.IndexFieldVersionValueConverter, Sitecore.ContentSearch" /> 
        <converter handlesType="Sitecore.Data.Database, Sitecore.Kernel"        typeConverter="Sitecore.ContentSearch.Converters.IndexFieldDatabaseValueConverter, Sitecore.ContentSearch" /> 
       </converters> 
      </indexFieldStorageValueFormatter> 
      <IndexDocumentPropertyMapper type="Sitecore.ContentSearch.LuceneProvider.DefaultLuceneDocumentTypeMapper, Sitecore.ContentSearch.LuceneProvider" /> 
      <include hint="list:ExcludeTemplate"> 
       <template>{A87A00B1-E6DB-45AB-8B54-636FEC3B5523}</template> 
      </include> 
     </Configuration> 
    </customSearchNewsItem> 
    <contentSearch> 
     <configuration type="Sitecore.ContentSearch.LuceneProvider.LuceneSearchConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
      <indexes hint="list:AddIndex"> 
       <index id="sitecore_cope_news_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)" /> 
        <Configuration ref="customSearchNewsItem/Configuration" /> 
        <strategies hint="list:AddStrategy"> 
         <!-- NOTE: order of these is controls the execution order --> 
         <strategy ref="contentSearch/indexUpdateStrategies/syncMaster" /> 
        </strategies> 
        <commitPolicyExecutor type="Sitecore.ContentSearch.CommitPolicyExecutor, Sitecore.ContentSearch"> 
         <policies hint="list:AddCommitPolicy"> 
          <policy type="Sitecore.ContentSearch.TimeIntervalCommitPolicy, Sitecore.ContentSearch" /> 
         </policies> 
        </commitPolicyExecutor> 
        <locations hint="list:AddCrawler"> 
         <crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch"> 
          <Database>master</Database> 
          <Root>/sitecore/content/Cope/COPE/Site Settings/Site Content/News</Root> 
         </crawler> 
        </locations> 
       </index> 
      </indexes> 
     </configuration> 
    </contentSearch> 
</sitecore> 

+0

嗨,我不明白您的配置文件, 的结构[Sitecore的 - > customSearchNewsItem - >配置] 应该 [Sitecore的 - >配置 - > defaultIndexConfiguration] –

回答

2

的问题是,要覆盖缺省配置FIELDNAMES。您必须在fieldMap/fieldNames部分包含更多字段,因为Sitecore需要将几个字段转换为小写字母才能在lucene中正确匹配文档。

而不是只增加你的自定义字段_rendering,复制从DefaultIndexConfiguration整个节,然后添加您的自定义字段。

<fieldNames hint="raw:AddFieldByFieldName"> 
    <fieldType fieldName="_rendering" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" type="Sitecore.SharedSource.Search.DynamicFields.RenderingField,Sitecore.SharedSource.Search" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 

    <field fieldName="category" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 

    <!-- Fields from DefaultIndexConfiguration here -->   

</fieldNames> 
+3

只是_uniqueid字段应该足够http://stackoverflow.com/a/26096271/1274626 – ravisilva

8

Lucene的识别通过其唯一的ID索引这是在<fieldNames>部分_uniqueid

既然你创建自己的/独立的索引配置,你必须增加该领域的部分fieldNames部分,所以它会识别索引。

所以它应该像

<fieldNames hint="raw:AddFieldByFieldName"> 
    <field fieldName="_uniqueid" storageType="YES" indexType="TOKENIZED"  
        vectorType="NO" boost="1f" type="System.String"  
       settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
     <analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.LowerCaseKeywordAnalyzer, Sitecore.ContentSearch.LuceneProvider" /> 
    </field> 
    <!-- Your custom Fields --> 
</fieldNames> 
相关问题