Как использовать мультиполевой запрос и фильтры в Lucene.net - PullRequest
5 голосов
/ 02 февраля 2010

Я хочу выполнить поиск по нескольким полям по индексу 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.

Что я делаю не так?

1 Ответ

6 голосов
/ 04 февраля 2010

Я думаю, что теперь у меня есть решение.Я отказался от использования 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); 
...