【问题标题】:Solr - search for all substrings of a given stringSolr - 搜索给定字符串的所有子字符串
【发布时间】:2017-07-04 23:38:52
【问题描述】:

如果我有一个给定的字符串“ABCDEF”,我该如何运行搜索,这样我才能得到所有找到子字符串的结果,例如“A”、“EF”、“CDE”、“ABCDEF”

我在使用正则表达式时遇到了问题,因为搜索带有一些可能遗漏的字母的字符串会得到像“BDE”这样的结果,这是无效的,因为在这种情况下允许跳过“C”。

【问题讨论】:

  • 您尝试了哪些查询?
  • 您尝试过使用 NGramFilter 吗?
  • 你的问题很不清楚。您正在索引并尝试查找的文本是什么 (ABCDEF)?您正在搜索的搜索字符串是什么(A、EF 等)?
  • @Mysterion 到目前为止,我尝试了像 "A?B?C?D?E?F?" 这样的正则表达式尝试获取正确的东西......不过,这并没有走得太远。我知道有办法生成一个涵盖所有可能的子字符串迭代的大型正则表达式,但我希望避免这种混乱
  • @MatsLindh 这种看起来可能就是答案……你有什么推荐的在线 tuts 吗?结果我正在谷歌搜索并获得诸如“NGram tokenizer”之类的东西。我在正确的球场吗?

标签: solr fuzzy-search


【解决方案1】:

您可以在文本字段的分析链中使用 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"

在您的情况下,整个字符串将保留为单个值,因此您将拥有“四分”而不是单独的标记。

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

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

【讨论】:

  • 非常感谢。这些解释非常有帮助:)
【解决方案2】:

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

<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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多