Lucene部分单词匹配

时间:2011-03-09 15:44:01

标签: search-engine lucene.net

Lucene不支持开箱即用,所以我需要一些帮助来构建我的查询。

假设我的文档字段值为“Develop”

我希望在搜索“Dev”和“lop”时返回此文档。

也许创建两个查询?

"*keyword" 

"keyword*" 

"keyword"

你会怎样用多个词来做这件事?你会将句子/搜索分成单词列表并为每个单词做前面的例子吗?

1 个答案:

答案 0 :(得分:9)

您所问的是,如果我在任何大型搜索引擎上正确理解 可行。 Lucene使用term-document矩阵和倒置文件技术创建关键字索引(参见底部的链接)。一个完全成熟的字符串匹配可能是非常好的,但它不能扩展:你将永远无法在可接受的时间内查询一个体面大小的索引(比如说超过几十个/几百个文档)。

不过,这里有两个可能有帮助的想法......

音节标记化
用“开发”回到你的例子。只要你对让用户搜索音节感到满意,我想你可以做点什么。 您必须创建使用标记生成器,根据其音节拆分索引中的单词,并在音节上创建数据库索引。 (我不确定是否有内置的英语语言标记器可以做到这一点并且自己写一个也可能很棘手......)

重要的是要注意:
如果要索引完整的单词和单独的音节,索引的大小将比仅索引其中一个的大得多。

然而我不建议仅索引音节。如果你还想让你的用户搜索完整的单词'Develop'(我猜你想要的话),这将导致两个查询之间有一个逻辑,即<'dev' AND'lop'>。尽管Lucene在查询中支持这种逻辑结构,但它们非常昂贵。我个人在过去使用Lucene中的逻辑查询遇到了一些麻烦。

<强>词干
另一种以某种方式达到你正在尝试的方法可能是使用一种残酷的词干(http://en.wikipedia.org/wiki/Stemming)来阻止他们的第一个音节。 (这将允许搜索'dev'但不能搜索'lop'...)
再说一遍,我认为这个词干功能已不在Lucene了。为自己写一个将是一个痛苦,涉及与/导入巨大的词典。

<强>链接
如果你不了解搜索引擎的内部结构,可能会考虑这些: http://en.wikipedia.org/wiki/Index_%28search_engine%29
http://en.wikipedia.org/wiki/Vector_space_model
http://en.wikipedia.org/wiki/Inverted_file
http://en.wikipedia.org/wiki/Term-document_matrix
http://en.wikipedia.org/wiki/Tf-idf