2013-07-19 25 views
6

私はlucene 4.3.1でファジー検索を実装しましたが、結果に満足できません。私はそれが返すべき結果の数を指定したいと思います。たとえば、10個の結果が必要な場合は、どれくらい悪いものであっても10個のベストマッチが返されます。ほとんどの場合、私が検索した単語がインデックス内のものと非常に異なる場合は、何も返しません。より多くの/よりファジーな結果を得るにはどうすればいいですか?luceneによるファジー検索

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

答えて

4

大きな編集距離もはやのLucene 4.xではFuzzyQueryによってサポートされています。ここで私が持っているコードは

FuzzyQueryの現在の実装は、の巨大なのLucene 3.x実装からのパフォーマンスの改善ですが、2つの編集だけをサポートしています。 2 Damerau-Levenshteinの編集距離を超える距離は、ほとんど役に立たないと考えられます。 FuzzyQuery documentationによると

、あなたが本当に高い編集距離を持っている必要がある場合:

あなたが本当にこれをしたい場合は、代わりに(そのよう示唆モジュール内のスペルチェッカーなど)nグラムインデックス技術を使用することを検討してください。

強力な意味は、達成しようとしていることを再考し、より有用なアプローチを見つけることです。

+0

ありがとうございます、これは既に多くの役に立っています。私は170万エントリのrdf-graph(dbpediaから)のエントリを見つけようとします。探しているエントリはいくつかの単語で構成されていますが、通常、クエリには多くのスペルミスがあります。別の問題は、ドイツ語では、しばしば単語を分離したり連結したりすることができるということです。したがって私はより大きな距離が必要です。私は今何をしようとするよりも適切なアプローチを知っていますか? – tadumtada

+1

SpellCheckerは良いアプローチかもしれません。 [Metaphone](http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/language/Metaphone.html)は、スペルミスにも役立ちます。単語が分離または連結されている限り、それがかなり標準的であれば、おそらく['GermanAnalyzer'](http://lucene.apache.org/core/4_0_0/analyzers-common/org/apache/lucene/分析/ de/GermanAnalyzer.html)、これは、そのようなことを処理するStemFitlerを組み込んで、私は推測するだろう(しかし、私はドイツ語のステミングの詳細を知らない)。 – femtoRgon

+0

それは、彼らが非効率的な方法を取り除いたことを本当に悪くする。 SpellCheckerはクエリーではなく、クエリとして引数を取るAPIのために、あなたはアップグレード時に不自由なアプリが残っているLuceneの読者とサーチャー(Neo4j)を非表示にします。 –