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
如果我有一个给定的字符串 "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