短语查询和使用木瓦过滤器有什么区别?

bla*_*box 13 java lucene information-retrieval

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

从我发现的文章来看,问题似乎是找到n-gram(或shingle).

Lucene的有ShingleFilter,一个ShingleMatrixFilterShingleAnalyzerWrapper,这似乎与此相关的任务.

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

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

ShingleMatrixFilter和ShingleFilter有什么区别?

希望Lucene大师能找到这个问题,然后回答;-)!

Rob*_*uir 17

使用短语与木瓦之间的差异主要涉及表现和得分.

当在单个单词在索引中的典型情况下使用短语查询(比如说"foo bar")时,短语查询必须遍历"foo"和"bar"的反向索引并找到包含这两个词的文档,然后在每个文档中查看他们的位置列表,找到"foo"出现在"bar"之前的地方.

这对性能和评分都有一些成本:

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

另一方面,如果你使用带状疱疹,你也可以为单词n-gram编制索引,换句话说,如果你的大小为2,你也会在索引中使用"foo bar"这样的术语.这意味着对于这个短语查询,它将被解析为一个简单的TermQuery,而不使用任何位置列表.而且由于它现在是一个"真正的术语",IDF这个短语将是准确的,因为我们确切知道这个"术语"存在多少文件.

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

  1. 增加术语字典,术语索引和发布列表大小,但这可能是一个公平的权衡,特别是如果您完全使用Field.setIndexOptions禁用位置.
  2. 索引分析阶段的一些额外成本:尽管ShingleFilter经过优化并且速度非常快.
  3. 没有明显的方法来计算"草率短语查询"或不精确的短语匹配,虽然这可以近似,例如对于带有大小为2的带状疱疹的"foo bar baz"的短语,你将有两个令牌:foo_bar,bar_baz并且你可以实现通过一些lucene的其他查询(如BooleanQuery)搜索不精确的近似值.

一般来说,使用Shingles或CommonGrams之类的索引word-ngrams只是权衡(相当专业),以降低位置查询的成本或增强短语评分.

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