私は姓、名、電話番号、住所などのように人々のデータベースのための一般的な連絡先情報と直接連絡先を検索するのLuceneを使用しています。この質問は、による検索に特異的に関連します名前と苗字。ここに私がどのように名前を索引付けしているかを示します。Luceneのクエリ得点
document.add(new Field("firstName", contact.getFirstName(), Field.Store.NO, Field.Index.NOT_ANALYZED));
document.add(new Field("lastName", contact.getLastName(), Field.Store.NO, Field.Index.NOT_ANALYZED));
私はこのようなインデックスを探しています:
IndexReader indexReader = IndexReader.open(FSDirectory.open(directory));
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
int hitsPerPage = indexSearcher.maxDoc();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
String[] fields = {"id", "firstName", "lastName", "phoneNumber", "email", "address", "website"};
BooleanQuery booleanQuery = new BooleanQuery();
String[] terms = queryString.split(" ");
for(String term : terms) {
for(String field : fields) {
booleanQuery.add(new FuzzyQuery(new Term(field, term)), BooleanClause.Occur.SHOULD);
}
}
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
indexSearcher.search(booleanQuery, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
それはフィールドが正確でない場合、私は結果を取得することができますので、私はMultiFieldQueryとは対照的に、ブールクエリを使用していた理由があります。基本的には、クエリーストリングを空白で分割して、インデックスの各フィールドにこれらのキーワードのそれぞれの用語を追加します。私はLuceneを初めて使ったので、これが最適な方法であるかどうかは本当に分かりませんが、これまでのところ、私にとってはうまくいきました。
私がいるだけしゃっくりはフルネームで検索する場合、それは正しい順序で結果を返していないことです。
インデックスには、John DoeとJohn Smithという2つのレコードがあります。
私は私の結果は次のようになりますジョン・ドウを検索: 1)ジョン・スミス 2)ジョン・ドウ
私はジョン・スミスを入力した場合には、最初のジョン・ドウを逆にして表示されます。最初の結果として正確な一致が返されないのはなぜですか?
これは、あなたが提供したことに基づいて、奇妙な結果に見えます。私はあなたがどのようにインデックスを構築しているかをもっと見ることに興味があります。間違ったものがインデックスに登録されたり、どこかに格納されている可能性はありますか? – femtoRgon