我目前正在使用lucene索引网页。目的是能够快速提取哪个页面包含某个表达式(通常为1,2或3个单词),以及其他单词(或其中1到3个组)也在页面中。 这将用于构建/丰富/修改同义词库(固定词汇表)。
从我发现的文章来看,问题似乎是找到n-grams(或整理)。
Lucene有一个ShingleFilter,一个ShingleMatrixFilter和一个ShingleAnalyzerWrapper,它们似乎与此任务相关。
从这个presentation,我了解到Lucene还可以搜索由固定数量的单词(称为slops)分隔的术语。提供了一个示例here。
但是,我不明白这些方法之间的区别?它们是根本不同的,还是你必须做出的性能/索引尺寸选择?
ShingleMatrixFilter与ShingleFilter有什么区别?
希望Lucene大师能找到这个问题,然后回答;-)!
答案 0 :(得分:17)
使用短语与木瓦之间的差异主要涉及表现和得分。
在索引中使用单个词的典型情况下使用词组查询(比如说“foo bar”)时,词组查询必须遍历“foo”和“bar”的反向索引,并找到包含这两个词的文档术语,然后在每个文档中走出他们的位置列表,找到“foo”出现在“bar”之前的地方。
这对性能和得分都有一些成本:
另一方面,如果你使用带状疱疹,你也可以索引单词n-gram,换句话说,如果你的是大小为2,你也会在索引中使用像“foo bar”这样的术语。这意味着对于这个短语查询,它将被解析为一个简单的TermQuery,而不使用任何位置列表。而且由于它现在是一个“真正的术语”,IDF这个短语将是准确的,因为我们确切知道这个“术语”存在多少文件。
但使用带状疱疹也有一些成本:
一般而言,使用Shingles或CommonGrams等词语索引word-ngrams只是权衡(相当专业),以降低位置查询的成本或增强短语评分。
但是这个东西有真实的用例,这里有一个很好的例子: http://www.hathitrust.org/blogs/large-scale-search/slow-queries-and-common-words-part-2