我有一个lucene索引,文档有大约20种不同的语言,而且都在同一个索引中,我有一个字段'lng‘,我只用一种语言过滤结果。
基于这个索引,我实现了拼写检查,问题是我从所有语言中得到建议,这些都是无关的(如果我用英语搜索,德语建议不是我所需要的)。我的第一个想法是为每种语言创建不同的拼写检查索引,而不是根据查询的语言选择索引,但我不喜欢这样,是否可以在拼写检查索引中添加额外的列并使用它,或者有更好的方法来做到这一点?
另一个问题是如何改进搜索查询中的两个或更多术语的建议,目前我只对第一个术语进行了改进,可以对其进行强大的改进,以便将它们结合使用,但是我找不到任何示例或实现来帮助我解决这个问题。
谢谢阿尔米尔
发布于 2011-11-16 21:28:24
如果您查看SpellChecker.SuggestSimilar的来源,您可以看到:
BooleanQuery query = new BooleanQuery();
String[] grams;
String key;
for (int ng = GetMin(lengthWord); ng <= GetMax(lengthWord); ng++)
{
<...>
if (bStart > 0)
{
Add(query, "start" + ng, grams[0], bStart); // matches start of word
}
<...>也就是说,建议搜索只是一堆OR'd‘布尔查询。您当然可以在这里修改此代码,如下所示:
query.Add(new BooleanClause(new TermQuery(new Term("Language", "German")),
BooleanClause.Occur.MUST));只会用德语寻找建议。但是,除了有多个拼写检查程序之外,如果不修改代码,就无法做到这一点。
要处理多个术语,请使用QueryTermExtractor获取一个术语数组。为每一个做拼写检查,并加入笛卡尔。您可能希望对每个组合运行一个查询,然后根据它们发生的频率进行排序(比如单单词拼写检查器是如何工作的)。
发布于 2011-11-13 08:25:43
在使用lucene和sphinx在两个不同的站点中实现两个不同的搜索功能之后,我可以说斯芬克斯是明显的赢家。
考虑使用http://sphinxsearch.com/而不是lucene。它被craigslist等人使用。
它们有一个叫做形态学预处理器的特性:
# a list of morphology preprocessors to apply
# optional, default is empty
#
# builtin preprocessors are 'none', 'stem_en', 'stem_ru', 'stem_enru',
# 'soundex', and 'metaphone'; additional preprocessors available from
# libstemmer are 'libstemmer_XXX', where XXX is algorithm code
# (see libstemmer_c/libstemmer/modules.txt)
#
# morphology = stem_en, stem_ru, soundex
# morphology = libstemmer_german
# morphology = libstemmer_sv
morphology = none有许多可用的词干器,正如你所看到的,德国人就是其中之一。
更新:
阐述为什么我觉得狮身人面像一直是我的明确赢家。
是的,这些只是一些观点而已。然而,这是一种来自尝试过这两种系统的人的意见。
希望能帮上忙..。
https://stackoverflow.com/questions/8110469
复制相似问题