首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Lucene拼写检查器5.3.1中,如何获得最接近的匹配,无论它有多糟糕?

问在Lucene拼写检查器5.3.1中,如何获得最接近的匹配,无论它有多糟糕?
EN

Stack Overflow用户
提问于 2015-12-05 14:16:20
回答 1查看 216关注 0票数 0

我有一些代码看起来像这样(片段):

代码语言:javascript
复制
public List<String> search(String streetNumber, String streetDirection, String streetName) throws ParseException, IOException {

    IndexReader ir = DirectoryReader.open(fsDirectory);
    Dictionary d = new LuceneDictionary(ir, "text");

    try(SpellChecker spellchecker = new SpellChecker(fsDirectory)) {
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
        spellchecker.indexDictionary(d, indexWriterConfig, true);
        String text = streetNumber + " " + streetDirection + " " + streetName;
        String[] suggestions = spellchecker.suggestSimilar(text, MAX_MATCHES, 0.00001F);
        return Arrays.asList(suggestions);
    }
}

我用下面的代码来测试它:

代码语言:javascript
复制
package ctc.api.web.service.impl;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import org.apache.lucene.queryparser.classic.ParseException;
import org.testng.annotations.Test;

public class LuceneIndexServiceImplTest {

  @Test
  public void f() throws ParseException, IOException {

      LuceneIndexServiceImpl t = new LuceneIndexServiceImpl();

      String[] texts = { "123 n main st", "234 s apple st", "345 w orange st" };

      t.addToIndex(Arrays.asList(texts).stream());

      List<String> r;

      r = t.search("123", "n", "moin");
      org.testng.Assert.assertEquals(r.toString(), "[123 n main st]");

      r = t.search("234", "", "opple");
      org.testng.Assert.assertEquals(r.toString(), "[234 s apple st]");

      r = t.search("345", "", "oge ave");
      org.testng.Assert.assertEquals(r.toString(), "[345 w orange st]");

      r = t.search("", "", "geez");
      org.testng.Assert.assertEquals(r.toString(), "[345 w orange st]");

  }
}

不幸的是,我似乎不能让最后一个断言通过。Lucene返回空,因为匹配太差了(只有字母"ge“匹配)。不幸的是,对我的应用程序来说,任何匹配都比没有匹配要好。

如何通过编辑距离强制Lucene拼写检查返回最接近的字符串?

EN

回答 1

Stack Overflow用户

发布于 2015-12-05 14:24:40

在lucene doc的lucene.Quote中,模糊搜索方法被称为模糊搜索

模糊搜索

Lucene支持基于Levenshtein距离或编辑距离算法的模糊搜索。要执行模糊搜索,请在单个单词术语的末尾使用代字号"~“。例如,要搜索拼写与"roam“相似的术语,请使用模糊搜索:

漫游~这个搜索会找到像泡沫和漫游这样的词条。

从Lucene 1.9开始,一个额外的(可选)参数可以指定所需的相似性。该值介于0和1之间,并且值更接近1,只有相似度较高的术语才会被匹配。例如:

roam~0.8如果未给出参数,则使用的默认值为0.5。

为模糊搜索提供了许多解决方案,如How to get Lucene Fuzzy Search result 's matching terms?

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

https://stackoverflow.com/questions/34101943

复制
相关文章

相似问题

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