Apache Luceneを使用して検索可能な電話/ローカルビジネスディレクトリを作成しようとしています。Lucene:検索語としての複数単語のフレーズ
私には、通り名、会社名、電話番号などのフィールドがあります。私は、通り名が複数の単語(例: '三日月')を持つ通りで検索しようとすると、結果が返されます。しかし、「三日月」のように単語を1つだけ検索しようとすると、すべての結果が得られます。
私は次のようにデータのインデックスを作成しています:
String LocationOfDirectory = "C:\\dir\\index";
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_34);
Directory Index = new SimpleFSDirectory(LocationOfDirectory);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE.34, analyzer);
IndexWriter w = new IndexWriter(index, config);
Document doc = new Document();
doc.add(new Field("Street", "the crescent", Field.Store.YES, Field.Index.Analyzed);
w.add(doc);
w.close();
私の検索は、次のように動作します:
int numberOfHits = 200;
String LocationOfDirectory = "C:\\dir\\index";
TopScoreDocCollector collector = TopScoreDocCollector.create(numberOfHits, true);
Directory directory = new SimpleFSDirectory(new File(LocationOfDirectory));
IndexSearcher searcher = new IndexSearcher(IndexReader.open(directory);
WildcardQuery q = new WildcardQuery(new Term("Street", "the crescent");
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
私は全体と最初のフレーズクエリのワイルドカードクエリを交換しようとしています文字列を空白に分割し、次のようにBooleanQueryでラップします。
String term = "the crescent";
BooleanQuery b = new BooleanQuery();
PhraseQuery p = new PhraseQuery();
String[] tokens = term.split(" ");
for(int i = 0 ; i < tokens.length ; ++i)
{
p.add(new Term("Street", tokens[i]));
}
b.add(p, BooleanClause.Occur.MUST);
しかし、これはうまくいかなかった。私は、StandardAnalyzerの代わりにKeywordAnalyzerを使ってみましたが、他のすべてのタイプの検索は機能しなくなりました。スペースを他の文字(+と@)で置き換えて、このフォームとの間でクエリを変換しようとしましたが、それでも動作しません。私は+と@は索引付けされていない特殊文字なので動作しないと思いますが、どこの文字がそのようなものかのリストを見つけることはできません。
私はやや怒っていますが、誰かが間違っていることを知っていますか?
おかげで、 のRik
特殊文字がここで見つけることができます。http://lucene.apache.org/core/3_5_0/queryparsersynta x.html#N10180 – Oliver