我有一些代码看起来像这样(片段):
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“匹配)。不幸的是,对我的应用程序来说,任何匹配都比没有匹配要好。
如何通过编辑距离强制Lucene拼写检查返回最接近的字符串?
发布于 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?
https://stackoverflow.com/questions/34101943
复制相似问题