2016-04-18 100 views
2

我试图设置使用Ngram进行内容搜索的自动完成功能。 这里是我的Lucene索引: 使用NGram的Sitecore&Lucene搜索自动完成

<autocompleteSearchConfiguration type="Sitecore.ContentSearch.LuceneProvider.LuceneIndexConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
     <indexAllFields>false</indexAllFields> 
     <initializeOnAdd>true</initializeOnAdd> 
     <analyzer ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/analyzer" /> 
     <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch"> 
     <fieldNames hint="raw:AddFieldByFieldName"> 
      <field 
      fieldName="page_title" 
      storageType="YES" 
      indexType="TOKENIZED" 
      vectorType="NO" 
      boost="1.5f" 
      nullValue="NULL" 
      emptyString="EMPTY" 
      type="System.String" 
      settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
      <analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.NGramAnalyzer, Sitecore.ContentSearch.LuceneProvider" /> 
      </field> 
     </fieldNames> 
     </fieldMap> 
     <fields hint="raw:AddComputedIndexField"> 
     <field fieldName="page_title" storageType="yes">Client.Website.Code.Search.AutoCompleteTitle, Client.Website</field> 
     </fields> 
     <fieldReaders ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/fieldReaders"/> 
     <indexFieldStorageValueFormatter ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/indexFieldStorageValueFormatter"/> 
     <indexDocumentPropertyMapper ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration/indexDocumentPropertyMapper"/> 
     <documentBuilderType>Sitecore.ContentSearch.LuceneProvider.LuceneDocumentBuilder, Sitecore.ContentSearch.LuceneProvider</documentBuilderType> 
    </autocompleteSearchConfiguration> 

请注意,我现在用的是NgramAnalyzer(参考:Sitecore.ContentSearch.LuceneProvider.Analyzers)。

当我以卢克的眼光来看这个指数时,我可以看到它显示了正确的数据。 但是,以下iQueryable不保留任何结果。

var index = ContentSearchManager.GetIndex("INDEX NAME GOES HERE"); 
using (var context = index.CreateSearchContext()) 
{ 
var query = context.GetQueryable<AutocompleteSearchResult>().Where(i => i.PageTitle == term) 
var result = query.GetResults(); 
} 

回答

2

为什么不使用“StartsWith”而不是==?

请参阅this文章。

Sitecore为Lucene.net(Sitecore.ContentSearch.LuceneProvider.Analyzers)提供了一个n-gram分析器。如果您使用Solr,则可以在Solr Schema.xml文件中进行设置。

您可以使用n-gram分析器为搜索输入创建自动完成功能。分析器将令牌分成单元,双字母,三字母等。当用户键入单词时,n-gram分析器会使用它生成的令牌在不同的位置查找单词。

您可以通过向索引添加新字段并将此字段映射为使用n-gram分析器而不是缺省值来添加对自动完成的支持。当您运行LINQ查询来查询该字段,使用下面的代码:

using (IProviderSearchContext context = Index.CreateSearchContext()) 
     { 
      result = context.GetQueryable<SearchResultItem>(). 
       .Where(i => i.Name.StartsWith(“some”)) 
       .Take(20) 
       .ToList(); 
     } 

Sitecore的规定,使用八卦和一组英文单词停止的实现。如果您有其他要求,则可以构建新的分析仪并更改这些设置。

+0

在http://www.ehabelgindy.com/sitecore-7-solr-search-auto-complete-using-ngram/中,作者建议不要使用.startswith()。 –

+0

这是Solr。也许他们使==的行为有所不同?当你使用StartsWith会发生什么? – TheSoftwareJedi

1

使用n-grams在Sitecore中构建一个自动完成搜索对于使用Lucene而言比用Solr更难实现。主要有两个原因:

  1. 您需要创建自己的分析仪,因为Sitecore.ContentSearch.LuceneProvider.Analyzers.NGramAnalyzer不是为自动完成目的而构建的。
  2. 您需要防止您的搜索查询被NGramAnalyzer分析。通过使用Lucene作为您的搜索提供商,您没有一个不错的schema.xml,您可以根据需要配置索引和查询分析器。这需要在代码中手动完成。

有关如何构建如此自动完成搜索的更多信息,请按照this article