【问题标题】:How to match against subsets of a search string in SOLR/lucene如何匹配 SOLR/lucene 中搜索字符串的子集
【发布时间】:2011-06-20 10:17:41
【问题描述】:

我遇到了一个不寻常的情况。通常,当您搜索文本索引时,您是在针对具有大量术语的文档搜索少量关键字。

例如,您可能搜索“quick brown”并期望匹配“the quick brown fox jumps over the lazy dog”。

我的文档存储中有很多小短语,我希望将它们与更大的查询短语进行匹配。

例如,如果我有一个查询:

  • 《敏捷的棕狐跳过懒狗》

和文件

  • “快速棕色”
  • “狐狸”
  • “懒狗”

我想查找在查询中出现短语的文档。在这种情况下,“quick brown”和“lazy dog”(但不是“fox over”,因为尽管标记匹配,但它不是搜索字符串中的短语)。

SOLR/lucene 可以进行这种查询吗?

【问题讨论】:

    标签: lucene solr


    【解决方案1】:

    听起来您想在分析中使用 ShingleFilter,以便索引单词二元组:因此在查询和索引时都添加 ShingleFilterFactory。

    在索引时,您的文档将按如下方式编入索引:

    • “快速棕色”-> quick_brown
    • “fox over”-> fox_over
    • “懒狗”->lazy_dog

    在查询时,您的查询变为:

    • "the quick brown fox jumps over the lazy dog" -> "the_quick quick_brown brown_fox fox_jumps jumps_over over_the_lazy lazy_dog"

    这样还是不行,默认会形成词组查询。 所以在您的查询分析器中在 ShingleFilterFactory 之后添加 PositionFilterFactory。这“扁平化”了查询中的位置,以便查询解析器将输出视为同义词,这将产生一个带有这些子句的布尔查询(所有应该子句,所以它基本上是一个 OR 查询):

    布尔查询:

    • the_quick 或
    • quick_brown 或
    • brown_fox 或
    • ...

    这应该是最高效的方式,因为它实际上只是术语查询的布尔查询。

    【讨论】:

    • 谢谢罗伯特。我仍在消化您的回答,但似乎是合理的。它似乎假设一个固定的单一大小。如果您还有包含 3 个或更多令牌的文档,是否可以对其进行调整?
    • 好吧,如果您有一个包含 3 个标记的文档,我所描述的将索引两个二元组(quick brown fox -> quick_brown brown_fox)。所以它通常也应该可以正常工作?由于您只是索引二元组,它可能会返回一些误报(想象一个像“brown fox quick brown dog”这样的查询,这将匹配 3-token 文档,即使它实际上不包含“quick brown fox”,但确实包含两个词双元组),但这种情况可能很少见?
    【解决方案2】:

    听起来你想要 DisMax“最小匹配”参数。我在这里写了一篇关于这个概念的博客文章:http://blog.websolr.com/post/1299174416。还有Solr wiki on minimum match

    “最小匹配”概念适用于查询中的所有“可选”字词——未使用 +/- 明确指定的字词,无论它们是“+强制”还是“-禁止”。默认情况下,最小匹配为 100%,这意味着必须存在 100% 的可选术语。换句话说,您的所有条款都被认为是强制性的。

    这就是为什么您的较长查询当前不匹配包含该短语较短片段的文档的原因。较长搜索词组中的其他关键字被视为必填项。

    如果您将最低匹配项降至1,则只有一个可选条款将被视为强制性条款。在某些方面,这与默认的 100% 相反。就像你对quick brown fox… 的查询变成了quick OR brown OR fox OR … 等等。

    如果您将最小匹配设置为2,那么您的搜索词组将分成两个词组。搜索quick brown fox 会变成(quick brown) OR (brown fox) OR (quick fox) … 等等。 (请原谅我的伪查询,我相信你明白这一点。)

    最小匹配参数还支持百分比——比如说,20%——甚至有一些more complex expressions。所以有相当多的可调整性。

    【讨论】:

      【解决方案3】:

      只设置mm参数并不能满足你的需要,因为

      “敏捷的棕狐跳过懒狗”

      将匹配所有三个文档

      • “快速棕色”
      • “狐狸”
      • “懒狗”

      正如你所说:

      我想查找符合以下条件的文件 有一个短语出现在 询问。在这种情况下,“快速棕色”和 “懒狗”(但不是“狐狸”,因为 虽然令牌匹配它不是 搜索字符串中的短语)。

      【讨论】:

        猜你喜欢
        • 2015-03-10
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多