改进lucene拼写检查

改进lucene拼写检查,lucene,lucene.net,spell-checking,Lucene,Lucene.net,Spell Checking,我有一个lucene索引,文档使用大约20种不同的语言,所有文档都在同一个索引中,我有一个字段“lng”,我只使用一种语言过滤结果 基于这个索引,我实现了拼写检查器,问题是我从所有语言中得到的建议都是无关的(如果我用英语搜索,我不需要德语的建议)。我的第一个想法是为每种语言创建一个不同的拼写检查索引,而不是根据查询语言选择索引,但我不喜欢这样,是否可以在拼写检查索引中添加其他列并使用它,或者是否有更好的方法来做到这一点 另一个问题是我如何在搜索查询中改进对2个或更多术语的建议,目前我只是第一次这

我有一个lucene索引,文档使用大约20种不同的语言,所有文档都在同一个索引中,我有一个字段“lng”,我只使用一种语言过滤结果

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

另一个问题是我如何在搜索查询中改进对2个或更多术语的建议,目前我只是第一次这样做,结合使用它们可以大大改进,但我找不到任何示例或实现可以帮助我解决此问题

谢谢
almir

在lucene和sphinx两个不同的网站上实现了两种不同的搜索功能后,我可以说sphinx显然是赢家

考虑使用lucene而不是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
有许多可用的词干分析器,如您所见,德语就是其中之一

更新:

详细说明为什么我觉得斯芬克斯是我的赢家

  • 速度:斯芬克斯的速度很快。索引和服务搜索查询中的
  • 相关性:虽然很难量化这一点,但我觉得与lucene实现相比,使用sphinx可以获得更相关的结果
  • 对文件系统的依赖:对于lucene,我无法打破对文件系统的依赖。虽然它们是变通方法,比如创建ram磁盘,但我觉得选择sphinx的“仅在内存中运行”选项更容易。这对具有多个Web服务器的网站、向索引添加动态数据、重新编制索引等都有影响
是的,这些只是一个观点。然而,他们是一个已经尝试过这两种系统的人的意见


希望这会有所帮助……

据我所知,在拼写检查索引中添加“语言”字段是不可能的。我认为您需要定义几个搜索
拼写检查器来实现这一点

编辑:在注释中,查询的语言也是由用户输入的,因此我的回答仅限于:定义多个拼写检查。至于你补充的第二个问题,例如,我认为之前已经讨论过了


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

如果您查看拼写检查器的源代码。建议类似的
您可以看到:

    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
      }
      <...>
它只会寻找德语的建议。但是,除了有多个拼写检查器之外,如果不修改代码,就无法做到这一点



要处理多个术语,请使用获取术语数组。对每个进行拼写检查,并进行笛卡尔连接。您可能希望对每个组合运行一个查询,然后根据它们出现的频率进行排序(如单个单词拼写检查器的工作方式)

我认为这是一个关于lucene的问题,而不是关于alternativesYeah的问题,因为它把所有其他的回答都弄乱了。
我可以说斯芬克斯显然是赢家。
请在公共场合详细分享你的观点/经验,了解它为什么是赢家,这样人们就可以很容易地决定何时选择一个文本搜索引擎sphinx可以解决OP的问题吗?(多语言拼写检查)如果是这样的话,他们是如何做到的?Sphinx有一个叫做形态学的功能,它解决了OP的问题,这就是我为什么发布这个功能的原因。在这种情况下检测查询语言非常简单,有一个下拉列表,用户必须选择lanuge:)对不起,读了你的问题后,我有不同的印象——这不是很常见的信息,你也没有提到。嗨,你能为我提供“无法在拼写检查索引中添加‘语言’字段”的参考资料吗?如果是,我将接受is作为答案并奖励你-谢谢
  query.Add(new BooleanClause(new TermQuery(new Term("Language", "German")),
                    BooleanClause.Occur.MUST));