2

Lucene (3.6) ドキュメントに「タイトル」フィールドと「キーワード」フィールドがあります。のオブジェクトtitle=Testfair 2012-09と のキーワードがあるsomeTest場合、ドキュメントは次のように記述します。

Document doc = new Document();
doc.add(new Field("title", title, Field.Store.NO, Field.Index.ANALYZED));
doc.add(new Field("keyword", keyword, Field.Store.NO, Field.Index.ANALYZED));

私が使用する検索のために

QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36, new String[] { "title", "keyword" }, new StandardAnalyzer(Version.LUCENE_36));
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
queryParser.setAllowLeadingWildcard(true);
Query query = queryParser.parse(queryString);

IndexSearcher searcher = createSearcher();
TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;

インデックスでは、( Lukeを介して) インデックス内のフィールドにとtitleの値があることがわかります。"Testfair", "2012""09"

今、検索時に次の動作が必要です。

Testfair 2012-09 -> match     (1)
estfair          -> match     (2)
Testfair baz     -> no match  (3)

ケース(2)の暗黙のワイルドカード検索が必要なため、これを処理する方法がわかりません。*検索語を空白で分割し、すべての単語の前後に追加すると、 が検索される+(title:*testmesse*) +(title:*2012-09*)ため、2012-09は分割されず、結果は見つかりません。私が正しく理解している場合、問題はの使用法にありますがMultiFieldQueryParser、検索を正しく設定する方法や、インデックス作成プロセスを何らかの方法で変更する必要があるかどうかはわかりません。

どんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

1

その間に、「Lucene in Action」という本を入手し、そこからアドバイスを受けました。1つのフィールド内のすべての検索可能なフィールドを含む「catchall」フィールドを作成し、そのフィールドのみを検索します。このトリックの助けを借りて、MultiFieldQueryParser検索するフィールドが1つしかないため、スキップできます。これで、検索語を分析して、必要に応じて変更することができます。

于 2012-09-06T09:32:44.053 に答える