2013-02-06 135 views
3

我使用solr4與TermsComponent自動提示Solr的自動提示(如描述here) 我們正在做一個正則表達式「startsWith」 - 搜索,忽略上/下-情況下,整個SEARCHQUERY看起來是這樣的:用變音符號

<solr>/terms 
?terms.fl=name 
&terms=true 
&terms.limit=5 
&terms.regex=<term>.* 
&terms.regex.flag=case_insensitive 
&qt=%2Fterms 

讓我給你舉幾個例子是什麼返回:

test -> Test Listing; test lowercase 
Test -> Test Listing; test lowercase 

不幸的是,這個解決方案不能處理變音符號,umlaute,口音..所以下面將不起作用:

têst -> Test Listing; test lowercase; Têst áccènt 
Test -> Test Listing; test lowercase; Têst áccènt 

領域是一個string - 我已經試過了標記化test_en爲好,但沒有成功

<field name="name" type="string" indexed="true" stored="true" required="true" /> 

什麼是啓用雙向的最佳方式口音,搜索出該自動提示?


編輯:更改爲AnalyzerSuggester:

<searchComponent class="solr.SpellCheckComponent" name="autosuggest"> 
    <lst name="spellchecker"> 
     <str name="name">autosuggest</str> 
     <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> 
     <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.AnalyzingLookupFactory</str> 
     <str name="storeDir">autosuggest</str> 
     <str name="buildOnCommit">true</str> 
     <str name="field">asug</str> 
     <str name="suggestAnalyzerFieldType">text_asug</str> 

     <!-- Suggester properties --> 
     <bool name="exactMatchFirst">true</bool> 
    </lst> 
    </searchComponent> 
    <requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/autosuggest"> 
    <lst name="defaults"> 
     <str name="spellcheck">true</str> 
     <str name="spellcheck.dictionary">autosuggest</str> 
     <str name="spellcheck.onlyMorePopular">true</str> 
     <str name="spellcheck.count">5</str> 
     <str name="spellcheck.collate">true</str> 
    </lst> 
    <arr name="components"> 
     <str>autosuggest</str> 
    </arr> 
    </requestHandler> 

<fieldType name="text_asug" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.ASCIIFoldingFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.ASCIIFoldingFilterFactory"/> 
     </analyzer> 
    </fieldType> 

回答

3

這裏的問題是術語組件對編入索引的標記都適用於搜索和查詢。所以,如果你做unicode摺疊(這是你所做的),你將存儲摺疊文本版本。你可以不加重音地匹配它,但是你也可以在沒有重音的情況下重新獲得它。

我能想到的兩個選項:

1)店鋪摺疊,在一個領域中的非摺疊項。因此不知何故將「Têstáccènt」映射到「Test accent |Têstáccènt」。您在前綴「Test ..」處匹配,然後在客戶端提取第二個術語。如何做到這一點可能會很棘手。

2)改爲使用Suggester。這建立在拼寫檢查器之上,並且 - 如果我正確地閱讀文檔 - 允許指定替代field_type,其分析器在提示器的索引/查詢過程中使用(在solrconfig.xml中使用勉強記錄的queryAnalyzerFieldType參數)。因此,您的原始文本將以摺疊形式複製到提示器中。但是,可以推測,一旦建議者匹配某件事物,它將返回原始形式。但是,我不確定。主要是因爲它被宣稱爲剛出生的Lucene/Solr 4.1 AnalyzingSuggester的一個功能。事實上,本文明確覆蓋你的使用情況:

隨着其摺疊或正常化的情況下,修飾等(例如,使用 ICUFoldingFilter),的建議將匹配而不管 殼體和重音的分析儀。例如,查詢「ame ...」會提示 Amélie。

問題在於,您需要自己在此完成一個完整的示例。幾乎沒有指導。但它(分析結果)可能是你最好的選擇。

+0

我用分析結構試驗過它,並將我的修改附加到了我的第一篇文章中(我對查詢分析器也有相同的配置,但是刪除它並沒有改變結果,所以我猜這是不需要的)。所以'tést','test','Têst'都會返回'test name',這很奇怪,因爲asug只是一個copyField的名字,甚至沒有存儲..? –

+0

我隨機得到它「工作」 - 似乎是這樣的建議ter總是返回INDEXED字段值而不是實際字段值。 如果我在沒有索引分析器的情況下提供文檔,那麼使用索引分析器重新啓動,我找回正確的字段。不幸的是,這顯然不能用作最終解決方案:/ –

+0

您確定已從_original_字段中刪除摺疊分析器嗎?據我所知,AnalysisSuggester的文檔非常具體地說,匹配是在分析(摺疊)的形式,但結果是在原始的表面形式。如果您不確定,我會檢查從原始字段返回的令牌。 而我不確定copyField來自哪裏,對於簡單的場景你不應該需要它。 –

2

您需要創建一個自定義字段類型,也許類似text_en領域,但也實現了ASCIIFilterFoldingFactory來處理,在索引和查詢時間變音符號轉換。

+0

感謝Paige,我更新了第一篇文章以顯示所做的更改。我使用KeywordTokenizer來檢索整個術語(startsWith)。 儘管此檢索「asug:」testnâme「'或任何其他較低/較高/重音變體的正確文檔,但它不適用於autosuggest實現。任何想法什麼需要改變? 'terms.regex = Test。*''給我'test name'(應該返回'TêstNámè')並且在正則表達式中指定任何口音都不會給出任何結果:( –

+1

我不確定需要更改什麼我之前沒有使用過TermsComponent,在過去的AutoSuggest中,我遵循了wiki上的Suggester - http://wiki.apache.org/solr/Suggester大綱,基本上使用了SpellCheck 。 –