首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改进lucene拼写法

改进lucene拼写法
EN

Stack Overflow用户
提问于 2011-11-13 08:18:15
回答 2查看 2.2K关注 0票数 3

我有一个lucene索引,文档有大约20种不同的语言,而且都在同一个索引中,我有一个字段'lng‘,我只用一种语言过滤结果。

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

另一个问题是如何改进搜索查询中的两个或更多术语的建议,目前我只对第一个术语进行了改进,可以对其进行强大的改进,以便将它们结合使用,但是我找不到任何示例或实现来帮助我解决这个问题。

谢谢阿尔米尔

EN

回答 2

Stack Overflow用户

发布于 2011-11-16 21:28:24

如果您查看SpellChecker.SuggestSimilar的来源,您可以看到:

代码语言:javascript
复制
    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‘布尔查询。您当然可以在这里修改此代码,如下所示:

代码语言:javascript
复制
  query.Add(new BooleanClause(new TermQuery(new Term("Language", "German")),
                    BooleanClause.Occur.MUST));

只会用德语寻找建议。但是,除了有多个拼写检查程序之外,如果不修改代码,就无法做到这一点。

要处理多个术语,请使用QueryTermExtractor获取一个术语数组。为每一个做拼写检查,并加入笛卡尔。您可能希望对每个组合运行一个查询,然后根据它们发生的频率进行排序(比如单单词拼写检查器是如何工作的)。

票数 2
EN

Stack Overflow用户

发布于 2011-11-13 08:25:43

在使用lucene和sphinx在两个不同的站点中实现两个不同的搜索功能之后,我可以说斯芬克斯是明显的赢家。

考虑使用http://sphinxsearch.com/而不是lucene。它被craigslist等人使用。

它们有一个叫做形态学预处理器的特性:

代码语言:javascript
复制
 # 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磁盘,但我觉得选择斯芬克斯的“只在内存中运行”选项就更容易了。这对具有多个etc服务器的网站有影响,可以将动态数据添加到索引、重新编制索引等。

是的,这些只是一些观点而已。然而,这是一种来自尝试过这两种系统的人的意见。

希望能帮上忙..。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8110469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档