如何在SOLR/lucene中匹配搜索字符串的子集
我有一个不寻常的情况。通常,当您搜索文本索引时,您是针对包含大量术语的文档搜索少量关键字 例如,您可能会搜索“快速棕色”,并期望匹配“快速棕色狐狸跳过懒狗” 我的文档库中有很多小短语,我希望将它们与较大的查询短语进行匹配 例如,如果我有一个查询:如何在SOLR/lucene中匹配搜索字符串的子集,lucene,solr,Lucene,Solr,我有一个不寻常的情况。通常,当您搜索文本索引时,您是针对包含大量术语的文档搜索少量关键字 例如,您可能会搜索“快速棕色”,并期望匹配“快速棕色狐狸跳过懒狗” 我的文档库中有很多小短语,我希望将它们与较大的查询短语进行匹配 例如,如果我有一个查询: “敏捷的棕色狐狸跳过懒惰的狗” 文件呢 “快速棕色” “狐狸过来” “懒狗” 我想查找查询中出现短语的文档。在本例中,“quick brown”和“lazy dog”(但不是“fox over”,因为尽管标记匹配,但它不是搜索字符串中的短语)
- “敏捷的棕色狐狸跳过懒惰的狗”
- “快速棕色”
- “狐狸过来”
- “懒狗”
SOLR/lucene可以进行这种查询吗?听起来像是需要Demax“最小匹配”参数。我在这里写了一篇关于这个概念的博客文章:。还有一个问题 “最小匹配”概念应用于查询中的所有“可选”术语——未使用+/-明确指定的术语,无论它们是“+强制”还是“-禁止”。默认情况下,最小匹配为100%,这意味着必须存在100%的可选术语。换句话说,你的所有条款都是强制性的 这就是为什么较长的查询当前不匹配包含该短语较短片段的文档。较长搜索短语中的其他关键字被视为必填项 如果您将最小匹配项降到
1
,则只有一个可选条款将被视为强制性条款。在某些方面,这与100%的违约相反。这就像你查询的quickbrownfox…
变成quick或brown或fox或…
等等
如果将最小匹配项设置为2
,则搜索短语将分成两个词组。搜索quickbrownfox
会变成(quickbrown)或(brownfox)或(quickfox).
等等。(请原谅我的假想问题,我相信你明白了。)
最小匹配参数还支持百分比,比如说,
20%
,有些甚至支持。因此有相当多的可调整性。仅设置mm参数将无法满足您的需要,因为
“敏捷的棕色狐狸跳过懒惰的狗”
将匹配所有三个文档
- “快速棕色”
- “狐狸过来”
- “懒狗”
听起来您想在分析中使用ShingleFilter,以便为单词bigrams编制索引:所以在查询和索引时都添加ShingleFilterFactory 在编制索引时,您的文档将按如下方式编制索引:
- “快速棕色”->快速棕色
- “fox over”->fox_over
- “懒狗”->懒狗
- “敏捷的棕色狐狸跳过懒狗”->“敏捷的棕色狐狸跳过懒狗”
- 快还是快
- 快走棕色还是棕色
- 棕色狐狸
这应该是最有效的方法,因为它实际上只是一个术语查询的布尔查询。谢谢Robert。我仍在理解你的答案,但似乎是合理的。它似乎假设一个固定的单一大小。如果你有一个文档有3个或更多的令牌,它能适应吗?如果你有一个文档有3个令牌,我所描述的将索引两个bigram(quick brown fox->quick\u brown\u fox)。因此,它通常也可以正常工作?由于您只对bigrams进行索引,它可能会返回一些误报(想象一下像“brown fox quick brown dog”这样的查询,这将匹配3-token文档,尽管它实际上不包含“quick brown fox”,但确实包含两个单词bigrams),但这很可能是罕见的?