短语查询和使用单个过滤器之间的区别是什么?



我目前正在使用lucene索引网页。目的是能够快速提取哪个页面包含某个表达式(通常是1、2或3个单词),以及哪些其他单词(或其中的1到3个单词组)也在该页中。这将用于构建/丰富/更改同义词库(固定词汇表)。

从我找到的文章来看,问题似乎是找到n-grams(或shingle)。

Lucene有一个ShingleFilter,一个ShingleMatrixFilter和一个ShingleAnalyzerWrapper,它们似乎与这个任务有关。

从这个演示中,我了解到Lucene还可以搜索由固定数量的单词(称为slops)分隔的术语。这里提供了一个示例。

然而,我不清楚这些方法之间的区别。它们在本质上是不同的,还是你必须做出性能/索引大小的选择?

ShingleMatrixFilter和ShingleFilter的区别是什么?

希望Lucene专家能找到这个问题,并给出答案;-)!

使用phrase和shingle的区别主要在于性能和评分。

当在索引中有单个单词的典型情况下使用短语查询(例如"foo bar")时,短语查询必须遍历"foo"one_answers"bar"的倒排索引并找到包含这两个词的文档,然后遍历这些文档中的每个文档中的位置列表以找到"foo"出现在"bar"之前的位置。

这对性能和评分都有一定的影响:

  1. 位置(.prx)必须被索引和搜索,这就像倒排索引的额外"维度",这将增加索引和搜索时间
  2. 因为只有单独的术语出现在倒排索引中,所以没有计算真正的"短语IDF"(这可能不会影响您)。因此,这是基于术语idf的总和来估计的。

另一方面,如果你使用shingles,你也索引了n个词,换句话说,如果你将shingles的大小增加到2,你也会在索引中有像"foo bar"这样的词。这意味着对于这个短语查询,它将被解析为一个简单的TermQuery,而不使用任何位置列表。由于它现在是一个"实际术语",短语IDF将是精确的,因为我们确切地知道这个"术语"存在多少个文档。

但是使用瓦片也有一些成本:

  1. 增加术语字典,术语索引和帖子列表大小,尽管这可能是一个公平的权衡,特别是如果你完全禁用位置与Field.setIndexOptions。
  2. 在索引分析阶段的一些额外成本:尽管ShingleFilter优化得很好,而且相当快。
  3. 没有明显的方法来计算"粗心的短语查询"或不精确的短语匹配,尽管这可以近似,例如,对于大小为2的短语"foo bar baz",你将有两个令牌:foo_bar, bar_baz,你可以通过一些lucene的其他查询(如BooleanQuery)来实现搜索,以获得不精确的近似。

一般来说,用像Shingles或commongram这样的东西索引词图只是一种权衡(相当专业),以减少位置查询的成本或增强短语评分。

但是这个东西在现实世界中有很多用例,这里有一个很好的例子:http://www.hathitrust.org/blogs/large-scale-search/slow-queries-and-common-words-part-2

最新更新