【问题标题】:in Lucene Spell Checker 5.3.1, how to get nearest match regardless of how bad it is?在 Lucene Spell Checker 5.3.1 中,无论它有多糟糕,如何获得最近的匹配?
【发布时间】:2015-12-05 06:16:19
【问题描述】:

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

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);
    }
}

我用这个来测试它:

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”匹配)。不幸的是,对于我的应用程序,ANY 匹配总比 NO 匹配好。

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

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    这种方法在 lucene 中称为 Fuzzy Search。引用来自 lucene doc

    模糊搜索

    Lucene 支持基于 Levenshtein 距离的模糊搜索,或者 编辑距离算法。要进行模糊搜索,请使用波浪号“~”, 单个单词术语末尾的符号。例如搜索一个 与“漫游”拼写相似的术语使用模糊搜索:

    roam~ 这个搜索会找到像foam和roams这样的词。

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

    roam~0.8 如果没有给出参数,则使用的默认值是 0.5.

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

    【讨论】:

    • 不。 FuzzySearch 的编辑距离限制为 2。
    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多