【问题标题】:fuzzy search with lucene使用 lucene 进行模糊搜索
【发布时间】:2013-07-19 12:49:25
【问题描述】:

我使用 lucene 4.3.1 实现了模糊搜索,但我对结果不满意。我想指定它应该返回的一些结果。因此,例如,如果我想要 10 个结果,它应该返回 10 个最佳匹配项,无论它们有多糟糕。大多数情况下,如果我搜索的单词与索引中的任何内容都非常不同,它不会返回任何内容。我怎样才能获得更多/更模糊的结果?

这是我的代码:

    public String[] luceneQuery(String query, int numberOfHits, String path)
        throws ParseException, IOException {

    File dir = new File(path);
    Directory index = FSDirectory.open(dir);

    query = query + "~";
    Query q = new QueryParser(Version.LUCENE_43, "label", analyzer)
            .parse(query);

    IndexReader reader = DirectoryReader.open(index);
    IndexSearcher searcher = new IndexSearcher(reader);

    Query fuzzyQuery = new FuzzyQuery(new Term("label", query), 2);

    ScoreDoc[] fuzzyHits = searcher.search(fuzzyQuery, numberOfHits).scoreDocs;
    String[] fuzzyResults = new String[fuzzyHits.length];

    for (int i = 0; i < fuzzyHits.length; ++i) {
        int docId = fuzzyHits[i].doc;
        Document d = searcher.doc(docId);
        fuzzyResults[i] = d.get("label");
    }

    reader.close();
    return fuzzyResults;
}

【问题讨论】:

    标签: lucene full-text-search fuzzy-search


    【解决方案1】:

    Lucene 4.x 中的FuzzyQuery 不再支持大编辑距离。 FuzzyQuery 的当前实现是对 Lucene 3.x 实现的性能的巨大改进,但仅支持两个编辑。大于 2 Damerau–Levenshtein 编辑的距离被认为很少真正有用。

    根据FuzzyQuery documentation,如果你真的必须有更高的编辑距离:

    如果您确实需要,请考虑使用 n-gram 索引技术(例如建议模块中的 SpellChecker)。

    强烈的暗示是,您应该重新考虑您要完成的工作,并找到更有用的方法。

    【讨论】:

    • 谢谢,这已经很有帮助了。我尝试在包含 170 万个条目的 rdf-graph(来自 dbpedia)中查找条目。我查找的条目可能包含多个单词,并且通常查询有很多拼写错误。另一个问题是,在德语中,您经常可以将单词分开或连接起来。因此我需要更大的距离。你知道比我现在尝试的更合适的方法吗?
    • SpellChecker 可能是一个好方法。 Metaphone 在处理拼写错误方面也很有帮助。至于单词被分隔或连接,如果它非常标准,你可能会受益于使用GermanAnalyzer,它包含一个应该处理这类事情的StemFitler,我猜(我不知道德语词干的细节,不过)。
    • 他们删除了低效的方式真的很臭。 SpellChecker 不是查询,因此对于将查询作为参数并隐藏 Lucene 阅读器和搜索器 (Neo4j) 的 API,您在升级时会留下一个残缺的应用程序。
    猜你喜欢
    • 2020-06-25
    • 2014-05-04
    • 1970-01-01
    • 2014-06-11
    • 2016-11-20
    • 2012-06-08
    • 1970-01-01
    • 2016-01-18
    • 2021-06-11
    相关资源
    最近更新 更多