2012-01-26 10 views
0

私は姓、名、電話番号、住所などのように人々のデータベースのための一般的な連絡先情報と直接連絡先を検索するの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)ジョン・ドウ

私はジョン・スミスを入力した場合には、最初のジョン・ドウを逆にして表示されます。最初の結果として正確な一致が返されないのはなぜですか?

+0

これは、あなたが提供したことに基づいて、奇妙な結果に見えます。私はあなたがどのようにインデックスを構築しているかをもっと見ることに興味があります。間違ったものがインデックスに登録されたり、どこかに格納されている可能性はありますか? – femtoRgon

答えて

0

は私の状況では、インデックスを検索する適切な方法であることが判明しました。結果は、クライアント側で解析して表示していたために元に戻されていたため、まったく関係のない問題でした。

0

あなたはなぜ、インデックス別のフィールドの一部としてテキスト全体、すべてのフィールド全体のすべての用語を検索しようとしている場合は?そして、あなたはあなたの現在の設計を続行したい場合は、文書が他よりも高い得点されている理由を見つけるためにhttp://lucene.apache.org/java/3_5_0/api/all/org/apache/lucene/search/IndexSearcher.html#explain(org.apache.lucene.search.Query、int)を試すことができ、しかし

/* 
\\\\ is for escaping " 
*/ 
String searchCriteria = "all:\\\\"John Doe\\\\"^3 OR all:(John Doe)"; 
IndexSearcher is = new IndexSearcher(indexDirectory); 
Analyzer analyzer = new StandardAnalyzer(); 
QueryParser parser = new QueryParser("all", analyzer); 
Query query = parser.parse(searchCriteria); 
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true); 
indexSearcher.search(query, collector); 
ScoreDoc[] hits = collector.topDocs().scoreDocs; 

ようなクエリを発行することができます。ループのブールクエリとAを使用して

+0

このようなクエリを発行する実装方法のサンプルコードを入手する方法はありますか?そのネット上の良い例を見つけるのは難しいですし、私はそのようなカスタムクエリを行う方法を理解するのに少し苦労しています。 – ryandlf

+0

@ryandlf私は小さなコードスニペットを提供しています。私はあなたがそのアイデアを得ることを望みます。詳細は使用しているバージョンのjavadocを参照してください。 – naresh

関連する問題