基于lucene的模糊搜索

基于lucene的模糊搜索,lucene,full-text-search,fuzzy-search,Lucene,Full Text Search,Fuzzy Search,我用lucene 4.3.1实现了模糊搜索,但我对结果不满意。我想指定它应该返回的一些结果。例如,如果我想要10个结果,它应该返回10个最好的匹配,不管它们有多糟糕。大多数情况下,如果我搜索的单词与索引中的任何单词都非常不同,它将不返回任何内容。如何获得更多/更模糊的结果 下面是我的代码: public String[] luceneQuery(String query, int numberOfHits, String path) throws ParseExcepti

我用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;
}
public String[]luceneQuery(字符串查询,int numberOfHits,字符串路径)
抛出ParseException,IOException{
文件目录=新文件(路径);
目录索引=FSDirectory.open(dir);
query=query+“~”;
查询q=新的QueryParser(Version.LUCENE_43,“标签”,analyzer)
.解析(查询);
IndexReader=DirectoryReader.open(索引);
IndexSearcher search=新的IndexSearcher(阅读器);
查询fuzzyQuery=新的fuzzyQuery(新术语(“标签”,查询),2);
ScoreDoc[]fuzzyHits=searcher.search(fuzzyQuery,numberOfHits).scoreDocs;
String[]fuzzyResults=新字符串[fuzzyHits.length];
for(int i=0;i
Lucene 4.x中的
FuzzyQuery
不再支持大编辑距离。当前的
FuzzyQuery
实现是对Lucene 3.x实现的性能的巨大的改进,但只支持两种编辑。距离大于2 Damerau–Levenshtein编辑被认为很少真正有用

根据,如果您确实必须具有更高的编辑距离:

如果您真的想要这个,请考虑使用N-gram索引技术(如建议模块中的拼写检查程序)。


这意味着你应该重新思考你的目标,找到一个更有用的方法。

谢谢,这已经很有帮助了。我尝试在rdf图(来自dbpedia)中查找170万个条目。我查找的条目可以由多个单词组成,并且通常查询有很多拼写错误。另一个问题是,在德语中,你经常可以把单词分开或连在一起写。因此,我需要一个更大的距离。你知道比我现在尝试的更合适的方法吗?拼写检查器可能是一个不错的方法。在处理拼写错误时也很有帮助。至于被分离或连接的单词,如果它是相当标准的话,你可能会从使用中受益,我猜,它包含了一个StemFitler,应该可以处理这类事情(不过我不知道德语词干的细节)。它们删除了这种低效的方法,这真的很糟糕。SpellChecker不是一个查询,因此对于那些将查询作为参数并隐藏Lucene阅读器和搜索器(Neo4j)的API,升级时会留下一个残废的应用程序。