2011-11-13 91 views
3

我有一个lucene索引,这些文档大约有20种不同的语言,并且都在同一个索引中,我有一个字段'lng',我只用一种语言来筛选结果。改进lucene拼写检查

基于这个指数,我实现了拼写检查器,问题是我从所有语言中得到了无关的建议(如果我用英语搜索,德语建议不是我所需要的)。我的第一个想法是为每种语言创建一个不同的拼写检查索引,并根据查询语言选择索引,但我不喜欢这样,是否可以在拼写检查索引中添加额外的列并使用它,还是有更好的方法来做到这一点?

另一个问题是,如何改进搜索查询中2个或更多个术语的建议,目前我只是为第一个而做,可以强烈改进以结合使用它们,但我找不到任何样本,或者可以帮助我解决这个问题的实现。

感谢 阿尔米尔实现两个不同的站点既Lucene和狮身人面像两个不同的搜索功能

回答

-2

后,我可以说,斯芬克斯是明显的赢家。

考虑使用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 

有很多可用的词干,正如你所看到的,德国是其中之一。

UPDATE:

拟订为什么我觉得那个狮身人面像一直是我明显的赢家。

  • 速度:狮身人面像是快速愚蠢。索引编制和服务搜索查询。
  • 相关性:虽然很难量化,但我觉得我能够得到更多的相关结果与狮身人面像相比,我的lucene实现。
  • 对文件系统的依赖:对于lucene,我无法打破对文件系统的依赖。虽然他们是变通方法,比如创建一个RAM磁盘,但我觉得选择sphinx的“仅在内存中运行”选项会更容易。这对具有多个网络服务器的网站有影响,向索引添加动态数据,重新索引等。

是的,这些仅仅是意见的观点。然而,他们是来自尝试这两种系统的人的意见。

希望帮助...

+2

我认为这是一个关于lucene的问题,而不是替代品 –

+0

是的,因为它是所有其他的反应混乱。 – Homer6

+0

'我可以说狮身人面像是一个明显的赢家.'请在公共场合详细分享您的意见/经验,说明它为什么是赢家,这样人们可以轻松地决定选择文本搜索引擎 –

2

据我所知,这是不可能的“语言”字段添加到拼写检查指标。我认为你需要定义几个搜索SpellChecker来实现这一点。

编辑:因为它在查询结果中查询的语言也由用户输入,那么我的答案仅限于:定义多个拼写检查。至于你添加的第二个问题,我认为之前已经讨论过,例如here

然而,即使有可能,它也没有解决最大的问题,那就是查询语言的检测。对于非常短的消息来说,这是非常不平凡的任务,可以包括缩写词,专有名词和俚语。简单的基于n-gram的方法可能不准确(例如来自Tika的语言检测器)。所以我认为最具挑战性的部分是如何使用来自语言检测器和拼写检查器的确定性分数以及应该选择哪个阈值来提供有意义的更正(例如,语言检测器更喜欢德语,但拼写检查器在丹麦语中具有良好匹配...)。

+0

在这种情况下检测查询语言是非常简单的,有一个下拉列表和用户必须选择lanuge :) – zebra

+0

对不起,我读了你的问题后有不同的印象 - 这是不是很平常有这个信息,你避难没有提到它。 –

+0

你好,你能否给我提供参考资料“这是不可能添加'语言'字段的拼写检查指数”如果是的话我会接受是答案和奖励你的赏金 - 谢谢 – zebra

2

如果你看看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 
     } 
     <...> 

I.E.建议搜索只是一堆OR'd布尔查询。您当然可以修改此代码,如下所示:

query.Add(new BooleanClause(new TermQuery(new Term("Language", "German")), 
        BooleanClause.Occur.MUST)); 

它只会查找德语的建议。除了拥有多个拼写检查程序外,如果不修改代码,则无法执行此操作。


要处理多个条款,请使用QueryTermExtractor来获取您的条款数组。对每个人进行拼写检查,并进行笛卡尔连接。您可能希望在每个组合上运行查询,然后根据它们发生的频率进行排序(如单字拼写检查程序的工作方式)。