Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SOLR/lucene中匹配搜索字符串的子集_Lucene_Solr - Fatal编程技术网

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

如何在SOLR/lucene中匹配搜索字符串的子集,lucene,solr,Lucene,Solr,我有一个不寻常的情况。通常,当您搜索文本索引时,您是针对包含大量术语的文档搜索少量关键字 例如,您可能会搜索“快速棕色”,并期望匹配“快速棕色狐狸跳过懒狗” 我的文档库中有很多小短语,我希望将它们与较大的查询短语进行匹配 例如,如果我有一个查询: “敏捷的棕色狐狸跳过懒惰的狗” 文件呢 “快速棕色” “狐狸过来” “懒狗” 我想查找查询中出现短语的文档。在本例中,“quick brown”和“lazy dog”(但不是“fox over”,因为尽管标记匹配,但它不是搜索字符串中的短语)

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

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

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

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

  • “敏捷的棕色狐狸跳过懒惰的狗”
文件呢

  • “快速棕色”
  • “狐狸过来”
  • “懒狗”
我想查找查询中出现短语的文档。在本例中,“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
  • “懒狗”->懒狗
查询时,您的查询变成:

  • “敏捷的棕色狐狸跳过懒狗”->“敏捷的棕色狐狸跳过懒狗”
这仍然不好,默认情况下,它将形成一个短语查询。 因此,在您的查询分析器中,仅在ShingleFilterFactory之后添加PositionFilterFactory。这将“展平”查询中的位置,以便queryparser将输出视为同义词,这将生成一个包含这些子项的布尔查询(所有应子句,因此基本上是OR查询):

布尔查询:

  • 快还是快
  • 快走棕色还是棕色
  • 棕色狐狸

这应该是最有效的方法,因为它实际上只是一个术语查询的布尔查询。

谢谢Robert。我仍在理解你的答案,但似乎是合理的。它似乎假设一个固定的单一大小。如果你有一个文档有3个或更多的令牌,它能适应吗?如果你有一个文档有3个令牌,我所描述的将索引两个bigram(quick brown fox->quick\u brown\u fox)。因此,它通常也可以正常工作?由于您只对bigrams进行索引,它可能会返回一些误报(想象一下像“brown fox quick brown dog”这样的查询,这将匹配3-token文档,尽管它实际上不包含“quick brown fox”,但确实包含两个单词bigrams),但这很可能是罕见的?