Solr - 搜索给定字符串的所有子字符串

时间:2017-02-16 03:13:05

标签: solr fuzzy-search

如果我有一个给定的字符串“ABCDEF”,我如何运行搜索,这样我就可以得到所有结果,它找到了诸如“A”,“EF”“CDE”“ABCDEF”的子字符串

我在使用正则表达式时遇到了麻烦,因为搜索字符串中有一些可以错过的字母会给我带来“BDE”这样的结果,这是无效的,因为在这种情况下允许跳过“C”。

2 个答案:

答案 0 :(得分:0)

您可以在分析链中使用NGramFilter(非tokenizer)作为文本字段 - 它会将文本拆分为单独的标记,用于提交文本的每个子字符串。您可以提供子字符串的最小/最大长度,允许您调整生成的标记的长度。

如果您的输入只是您要搜索子字符串的单个字符串,请使用KeywordTokenizer - 这会将您的输入字符串保留为单个标记,然后用于generate the substrings with the NgramFilter

<filter class="solr.NGramFilterFactory"/>

min / max的默认值是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"

在您的情况下,整个字符串将保留为单个值,因此您将获得“四分”而不是分隔代币。

维基上示例中为1/4值给出的示例目前是错误的(似乎已经从EdgeNGramFilter中复制了),所以请忽略它。

您需要调整最小/最大值,具体取决于您要查询内容的方式。如果您永远不会查询长度小于3的子字符串,请使用3作为最小值。

答案 1 :(得分: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>

N.B。在查询时,如果您不想要意外行为,请不要进行任何Ngram令牌过滤。

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