如何匹配SOLR / lucene中搜索字符串的子集

时间:2011-02-03 03:44:17

标签: lucene solr

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

例如,您可能会搜索“快速棕色”并期望匹配“快速棕色狐狸跳过懒狗”。

我的情况是我的文档库中有很多小短语,我希望将它们与更大的查询短语相匹配。

例如,如果我有查询:

  • “快速的棕色狐狸跳过懒狗”

和文件

  • “quick brown”
  • “狐狸过来”
  • “懒狗”

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

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

3 个答案:

答案 0 :(得分:3)

听起来你想在分析中使用ShingleFilter,因此你可以索引单词bigrams:所以在查询和索引时都添加ShingleFilterFactory。

在索引时,您的文档会被编入索引:

  • “快速褐色” - > quick_brown
  • “狐狸过来” - > fox_over
  • “懒狗” - > lazy_dog

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

  • “快速的棕色狐狸跳过懒狗” - > “the_quick quick_brown brown_fox fox_jumps jumps_over over the the_lazy lazy_dog”

这仍然没有用,默认情况下会形成一个短语查询。 因此,只在查询分析器中在ShingleFilterFactory之后添加PositionFilterFactory。这会“展平”查询中的位置,以便查询器将输出视为同义词,这将产生带有这些子句的booleanquery(所有SHOULD子句,因此它基本上是一个OR查询):

BooleanQuery:

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

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

答案 1 :(得分: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。所以有相当多的可调整性。

答案 2 :(得分:1)

只有设置mm参数才能满足您的需求

“快速的棕色狐狸跳过懒狗”

将匹配所有三个文件

  • “quick brown”
  • “狐狸过来”
  • “懒狗”

正如你所说:

  

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