Solr:匹配查询字符串中包含的短语

时间:2011-10-28 14:09:34

标签: solr lucene

我刚刚开始尝试使用Solr,我已经认为我正试图向后使用它。有人能让我知道我想做什么是可能的吗?

在正常使用中,可以指定一个短语,然后在存储的文档中搜索该短语的实例。但是,我有一个存储短语列表,我正在尝试确定我的查询字符串包含哪些短语。

例如:假设我在Solr中存有这样的短语:

1:"fish fingers" 
2:"apple pie"

如果我的搜索词是“我喜欢鱼手指”,那么我希望Solr返回第一条记录。如果它是“我喜欢鱼手指和苹果派”,那么我希望它能同时返回两个记录。但如果它是“我喜欢苹果手指和鱼饼”,那么我希望它不会返回任何记录。

(当然,如果短语总是两个单词,那么通过构造一个包含所有两个单词短语的析取查询来实现这一点非常简单。但短语可能有任何长度。)。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我相信shingles - 用于匹配的令牌n-gram - 可能是解决问题的开始。

结帐ShingleFilterFactoryShingleFilter

答案 1 :(得分:2)

我决定阅读每个Filter和Tokenizer的文档,这是我遇到this description of the PositionFilterFactory的地方:

Another example is when exact matching hits 
are wanted for _any_ shingle within the query

此页面上给出的配置几乎正是我想要的。不幸的是,由于似乎没有一个过滤器将由分词器分割的术语粘合回一个令牌,我不能做任何干预。但也许我可以自己敲一下这样的过滤器。

答案 2 :(得分:1)

这似乎与谷歌搜索设备提供的匹配匹配搜索功能相同,它试图将索引条款与查询匹配,而不是相反。我们也必须实施自定义解决方案。

您可能需要为此实现自己的查询解析器 而且正如您已经提到的那样,这可能是您唯一的解决方案。

  • 生成搜索字词的组合,例如我喜欢鱼指 - >我喜欢,像鱼,鱼的手指,我喜欢鱼,像鱼的手指,我喜欢鱼的手指
  • 创建一个Disjunction max查询,其中短语与所有上述组合匹配,使用should boolean子句,这将使其匹配任何短语匹配。
  • 但是,这也不能提供完全匹配。
  • 还有一个警告,就好像存储的术语就像“漂亮的鱼手指”一样,“我喜欢鱼指”的查询仍然会与记录相匹配。所以你可能需要检查(可以提供我们使用的解决方法)。