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

Solr - search for all substrings of a given string

如果我有一个给定的字符串 "ABCDEF" 我怎样才能 运行 进行搜索,这样我就可以获得所有找到子字符串的结果,例如 "A"、"EF" "CDE" "ABCDEF"

我在使用正则表达式时遇到问题,因为搜索带有一些可以遗漏的字母的字符串会给我类似 "BDE" 的结果,这是无效的,因为在这种情况下允许跳过 "C" .

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

如果您的输入只是您要搜索其子字符串的单个字符串,请使用 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"

在您的情况下,整个字符串将保留为单个值,因此您将使用 "four score" 而不是分隔标记。

目前 wiki 上的示例中 1 / 4 in values 给出的示例是错误的(似乎它是从 EdgeNGramFilter 复制的),所以请忽略它。

您需要根据查询内容的方式调整 min/max 值。如果您永远不会查询长度小于三的子字符串,请使用 3 作为最小值。

我建议为您的用例使用特定的分析链:

<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