2016-04-18 130 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