それで、構築したい短いクエリがあります。ブールクエリを使用して、インデックスから一致したドキュメントの「タイプ」フィールドが「アイデア」でなければならないことを指定しています。次に、1 つ以上の単語である可能性があるユーザーからの検索文字列があります。クライアントの結果をプログラムで制限して、フィールドの「タイプ」が「インデックス」に等しいドキュメントのみをインデックスに含めるようにしたいのですが、検索語が検索の任意の単語と一致できるようにしたい結果に単語を含むフレーズ。以下のコードは、私が欲しいものを正確に説明していると思います。
WhitespaceAnalyzer analyzer = new WhitespaceAnalyzer();
MultiFieldQueryParser parser = new MultiFieldQueryParser(
Version.LUCENE_30, new string[] { "company", "description",
"name", "posterName"},
analyzer);
parser.AllowLeadingWildcard = true;
Lucene.Net.Search.Query query = parser.Parse(searchParam);
BooleanQuery bq = new BooleanQuery();
TermQuery tQuery = new TermQuery(new Lucene.Net.Index.Term("type", "Idea"));
bq.Add(tQuery, Lucene.Net.Search.Occur.MUST);
bq.Add(query, Lucene.Net.Search.Occur.MUST);
データにインデックスを付ける方法は、以下の関連コードの短い部分で説明されています。
Document doc = new Document();
doc.Add(new Field("type",
"Idea",
Field.Store.YES,
Field.Index.ANALYZED));
doc.Add(new Field("company",
(_idea.Company==null ?
"Company Not Set for Idea"
: _idea.Company.Name),
Field.Store.YES,
Field.Index.ANALYZED));
doc.Add(new Field("description",
_idea.Description,
Field.Store.YES,
Field.Index.ANALYZED));
doc.Add(new Field("name",
_idea.Name,
Field.Store.YES,Field.Index.ANALYZED));
if (_idea.Poster != null)
{
doc.Add(new Field("posterName",
_idea.Poster.FirstName + " " + _idea.Poster.LastName,
Field.Store.YES, Field.Index.ANALYZED));
}
doc.Add(new Field("ID",
_idea.ID.ToString(), Field.Store.YES,
Field.Index.NOT_ANALYZED));
iWriter.AddDocument(doc);
私が理解していないのは、インデックスに存在することがわかっている特定の単語を検索すると、結果が返されないことです。「*」などのワイルドカードを使用して検索した場合にのみ、結果が得られます。私が考えるのは、コードが MultiFieldQueryParser のドキュメントに対して行うことを正確に実行する場合、会社、説明、名前などのパラメーターのフィールドの一部がドキュメントで見つかった場合に一致を返すことです。 . しかし、そうではありません。たとえば、ドキュメントの 1 つで、「Another Idea」という名前フィールドがあることを知っています。「Another」/「another」/「Idea」などを検索すると、その特定のドキュメントが返されるはずです。しかし、そうではありません...ただし、タイプによって結果を正しくフィルタリングします。
この短いコード スニペットが必要な一致を返すようにするには、何をする必要がありますか?