短语查询和使用带状疱疹过滤器之间有什么区别?

2022-09-03 13:57:11

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

从我发现的文章中,问题似乎在于找到n-grams(或带状疱疹)。

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

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

但是,我不清楚这些方法之间的区别?它们是否根本不同,或者您必须做出性能/索引大小选择?

ShingleMatrixFilter和ShingleFilter有什么区别?

希望一个Lucene大师会找到这个问题,并回答;-)!


答案 1

使用短语与带状疱疹之间的差异主要涉及性能和评分。

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

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

  1. 位置(.prx)必须索引和搜索,这就像倒排索引的额外“维度”,这将增加索引和搜索时间
  2. 由于倒排索引中仅显示单个术语,因此没有计算出真正的“短语 IDF”(这可能不会影响您)。因此,这是基于术语IDF的总和的近似值。

另一方面,如果您使用带状疱疹,则还会索引单词n-grams,换句话说,如果您要瓦化到大小2,则索引中还将具有诸如“foo bar”之类的术语。这意味着对于此短语查询,它将被解析为简单的 TermQuery,而不使用任何位置列表。由于IDF现在是一个“实际术语”,因此短语IDF将是准确的,因为我们确切地知道这个“术语”存在多少文件。

但是使用带状疱疹也有一些成本:

  1. 增加了术语字典,术语索引和帖子列表大小,尽管这可能是一个公平的权衡,特别是如果您使用Field.setIndexOptions完全禁用头寸。
  2. 在索引的分析阶段有一些额外的成本:尽管ShigleFilter优化得很好,而且速度非常快。
  3. 没有明显的方法来计算“草率的短语查询”或不精确的短语匹配,尽管这可以近似,例如,对于大小为2的带状疱疹的“foo bar baz”短语,您将有两个标记:foo_bar,bar_baz,您可以通过Lucene的其他一些查询(如BooleanQuery)实现搜索,以获得不精确的近似值。

一般来说,使用带状疱疹或CommonGrams之类的东西索引单词ngram只是一种权衡(相当专业),以降低位置查询的成本或提高短语评分。

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


答案 2

推荐