2017-02-16 106 views
0

如果我有一個給定的字符串「ABCDEF」我怎麼能運行搜索,所以我可以得到的所有結果在那裏發現的子串,如「A」給定的字符串的所有子,「EF」,「CDE」 「ABCDEF」Solr的 - 搜索

我在使用正則表達式時遇到了麻煩,因爲搜索字符串時可能會漏掉一些字母,因此會給出像「BDE」這樣無效的結果,因爲在這種情況下,它允許跳過「C」。

+0

您試過了哪些查詢? – Mysterion

+0

你嘗試過使用NGramFilter嗎? – MatsLindh

+0

你的問題很不清楚。你正在索引和嘗試查找的文本是什麼(ABCDEF)?你正在搜索的搜索字符串是什麼(A,EF等)? –

回答

0

您可以使用NGramFilter(未標記生成器)的文本字段的分析鏈 - 它會分裂文成單獨標記爲提交的文本的每個子。您可以提供子字符串的最小/最大長度,允許您調整生成的令牌的長度。

如果輸入只是您要搜索的子串,使用KeywordTokenizer單字符串 - 這將讓你輸入的字符串作爲一個單一的令牌,然後被用於generate the substrings with the NgramFilter

<filter class="solr.NGramFilterFactory"/> 

默認對於最小值/最大值爲1和2,這給(從例子中):

In: "four score" 
Tokenizer to Filter: "four", "score" 
Out: "f", "o", "u", "r", "fo", "ou", "ur", "s", "c", "o", "r", "e", "sc", "co", "or", "re" 

在你的情況下,整個字符串將保持作爲一個單一的值,所以你必須「四個分值」,而不是分離令牌。

在維基的例子爲四分之一中值給出的例子目前是錯誤的(它似乎已經從EdgeNGramFilter複製),因此忽略。

你需要取決於你如何去查詢內容來調整最大/最小值。如果您永遠不會查詢長度小於三的子字符串,請使用3作爲最小值。

+0

非常感謝。解釋是非常有用的:) – Pie222

0

我會建議使用特定的分析鏈你的使用情況:

<fieldType name="text_ngram" class="solr.TextField"> 
    <analyzer type="index"> 
     ... 
     <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/> 
    </analyzer> 
    <analyzer type="query"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt" /> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" generateNumberParts="1" catenateWords="0" 
       catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 

注:在查詢時,如果您不想要意外的行爲,請不要執行任何Ngram標記過濾。

[1] https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions#FilterDescriptions-N-GramFilter