2011-03-09 80 views
2

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

可以说,我有一个字段值的文档“发展”

我想对于搜索将返回“开发”和“罗布泊”这个文件。

也许创建两个查询?

"*keyword" 

"keyword*" 

"keyword" 

你会如何去做这个与多个词?你会将句子/搜索分成一个单词列表,并为每个单词做前面的例子吗?

回答

9

你在问什么,如果我正确理解你不是任何大型搜索引擎的可行。
Lucene使用术语文档矩阵和倒排文件技术为关键字创建索引(请参阅底部的链接)。一个完全成熟的字符串匹配可能是非常好的,但它不能缩放:在可接受的时间内,您将永远无法查询大小适中的索引(例如多于几十个/数百个文档)。

但是,这里有两个想法,可以帮助...

音节切分
回来你的例子与“发展”。只要你对让用户搜索音节感到满意,我想你可以做一些事情。 您将不得不创建使用标记器,根据它们的音节将索引中的单词分开,并在音节上创建数据库索引。 (我不确定是否有内置的英语语言标记器可以做到这一点,并自己写一个可能会很棘手...)

一个重要的事情要注意:
如果你会索引全字而且,如果您仅指定其中的一个,则索引的大小将会比单独的音节大得多。

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

词干
另一种方法来在你想可能是使用单词的残酷形式所产生(http://en.wikipedia.org/wiki/Stemming)是茎的话他们的第一个音节什么莫名其妙到达。 (这将允许搜索“开发”,但不是'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