私は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;
}
ありがとうございます、これは既に多くの役に立っています。私は170万エントリのrdf-graph(dbpediaから)のエントリを見つけようとします。探しているエントリはいくつかの単語で構成されていますが、通常、クエリには多くのスペルミスがあります。別の問題は、ドイツ語では、しばしば単語を分離したり連結したりすることができるということです。したがって私はより大きな距離が必要です。私は今何をしようとするよりも適切なアプローチを知っていますか? – tadumtada
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
それは、彼らが非効率的な方法を取り除いたことを本当に悪くする。 SpellCheckerはクエリーではなく、クエリとして引数を取るAPIのために、あなたはアップグレード時に不自由なアプリが残っているLuceneの読者とサーチャー(Neo4j)を非表示にします。 –