如果我有一個給定的字符串「ABCDEF」我怎麼能運行搜索,所以我可以得到的所有結果在那裏發現的子串,如「A」給定的字符串的所有子,「EF」,「CDE」 「ABCDEF」Solr的 - 搜索
我在使用正則表達式時遇到了麻煩,因爲搜索字符串時可能會漏掉一些字母,因此會給出像「BDE」這樣無效的結果,因爲在這種情況下,它允許跳過「C」。
如果我有一個給定的字符串「ABCDEF」我怎麼能運行搜索,所以我可以得到的所有結果在那裏發現的子串,如「A」給定的字符串的所有子,「EF」,「CDE」 「ABCDEF」Solr的 - 搜索
我在使用正則表達式時遇到了麻煩,因爲搜索字符串時可能會漏掉一些字母,因此會給出像「BDE」這樣無效的結果,因爲在這種情況下,它允許跳過「C」。
您可以使用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作爲最小值。
非常感謝。解釋是非常有用的:) – Pie222
我會建議使用特定的分析鏈你的使用情況:
<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
您試過了哪些查詢? – Mysterion
你嘗試過使用NGramFilter嗎? – MatsLindh
你的問題很不清楚。你正在索引和嘗試查找的文本是什麼(ABCDEF)?你正在搜索的搜索字符串是什麼(A,EF等)? –