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

时间:2011-12-20 22:00:01

标签: java lucene information-retrieval

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

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

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

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

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

ShingleMatrixFilter与ShingleFilter有什么区别?

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

1 个答案:

答案 0 :(得分:17)

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

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

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

  1. 必须对位置(.prx)进行索引和搜索,这就像倒排索引的附加“维度”,这将增加索引和搜索时间
  2. 因为只有单个术语出现在倒排索引中,所以没有计算出真正的“短语IDF”(这可能不会影响您)。因此,这是基于术语IDF的总和来近似的。
  3. 另一方面,如果你使用带状疱疹,你也可以索引单词n-gram,换句话说,如果你的是大小为2,你也会在索引中使用像“foo bar”这样的术语。这意味着对于这个短语查询,它将被解析为一个简单的TermQuery,而不使用任何位置列表。而且由于它现在是一个“真正的术语”,IDF这个短语将是准确的,因为我们确切知道这个“术语”存在多少文件。

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

    1. 增加了术语词典,术语索引和发布列表大小,但这可能是一个公平的权衡,特别是如果您完全使用Field.setIndexOptions禁用位置。
    2. 索引编制分析阶段的一些额外费用:虽然ShingleFilter的优化非常好并且非常快。
    3. 没有明显的方法来计算“草率词组查询”或不精确的词组匹配,尽管这可以近似,例如,对于带有大小为2的带状疱疹的“foo bar baz”的短语,你将有两个令牌:foo_bar,bar_baz,你可以通过一些lucene的其他查询(比如BooleanQuery)来实现搜索,以获得不精确的近似值。
    4. 一般而言,使用Shingles或CommonGrams等词语索引word-ngrams只是权衡(相当专业),以降低位置查询的成本或增强短语评分。

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