2010-02-02 49 views
5

我想在lucene.net索引上執行多字段搜索,但是根據其中一個字段過濾結果。下面是目前我在做什麼:如何在Lucene.net中使用多字段查詢和過濾器

索引的字段的含義是:

doc.Add(new Field("id", id.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED)); 
doc.Add(new Field("title", title, Field.Store.NO, Field.Index.TOKENIZED)); 
doc.Add(new Field("summary", summary, Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.YES)); 
doc.Add(new Field("description", description, Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.YES)); 
doc.Add(new Field("distribution", distribution, Field.Store.NO, Field.Index.UN_TOKENIZED)); 

當我執行我做以下搜索:

MultiFieldQueryParser parser = new MultiFieldQueryParser(new string[]{"title", "summary", "description"}, analyzer); 
parser.SetDefaultOperator(QueryParser.Operator.AND); 
Query query = parser.Parse(text); 

BooleanQuery bq = new BooleanQuery(); 
TermQuery tq = new TermQuery(new Term("distribution", distribution)); 
bq.Add(tq, BooleanClause.Occur.MUST); 
Filter filter = new QueryFilter(bq); 

Hits hits = searcher.Search(query, filter); 

然而,結果總是0次點擊。

我在做什麼錯?

回答

6

我想我現在有一個解決方案。我放棄了使用QueryFilter,並使用布爾查詢來限制MultiFieldQuery之前的結果。因此,代碼會是這個樣子:

MultiFieldQueryParser parser = new MultiFieldQueryParser(new string[]{"title", "summary", "description"}, analyzer); 
parser.SetDefaultOperator(QueryParser.Operator.AND); 
Query query = parser.Parse(text); 

BooleanQuery bq = new BooleanQuery(); 
TermQuery tq = new TermQuery(new Term("distribution", distribution)); 
bq.Add(tq, BooleanClause.Occur.MUST); 
bq.Add(query, BooleanClause.Occur.MUST) 

Hits hits = searcher.Search(bq); 
+0

如果被搜索的目標文字「框中狐狸」,並通過客戶端輸入的搜索項只箱子,你怎麼Lucene來觸發的匹配「盒狐狸」文檔? – 2013-04-07 13:15:12

相關問題