2009-09-16 2 views
2

Я создал индекс, как.net Lucene поиск Multifield

Document doc = new Document(); 
     doc.Add(new Field("SearchKey", (item.FullTextColumn ?? item.Code), Field.Store.NO, Field.Index.TOKENIZED)); 
     doc.Add(new Field("Type", item.Type.ToString(), Field.Store.YES, Field.Index.TOKENIZED)); 
     doc.Add(new Field("Name", item.Name, Field.Store.YES, Field.Index.UN_TOKENIZED)); 
     doc.Add(new Field("Code", item.Code ?? string.Empty, Field.Store.YES, Field.Index.UN_TOKENIZED)); 

и т.д.

и я пытаюсь найти термин, как «Канзас-Сити» в поле «SearchKey», а другой подал «Тип» должен быть «Аэропорт»

за что я пишу

QueryParser parser = new QueryParser("SearchKey", analyzer); 
     Query searchQuery = parser.Parse(text); 
TermQuery typeQuery = new TermQuery(new Term("Type", "Airport")); 
BooleanQuery filterQuery = new BooleanQuery(); 
     filterQuery.Add(typeQuery, BooleanClause.Occur.MUST); 
     Filter f = new QueryFilter(filterQuery); 
Hits results = searcher.Search(searchQuery,f); 

но это не дает мне никакого результата,

если удалить «F» из

Hits results = searcher.Search(searchQuery,f); 

то это дает результат, но поле «Тип» содержит другие значения затем «Аэропорт».

любая идея, где я ошибаюсь?

ответ

2

Посмотрите на свой код. Мне кажется, вам нужно добавить каждый запрос (один для SearchKey и один для Type) в BooleanQuery, как показано ниже.

var standardLuceneAnalyzer = new StandardAnalyzer(); 

var query1 = new QueryParser("SearchKey", standardLuceneAnalyzer).Parse("Kansas City*"); 
var query2 = new QueryParser("Type", standardLuceneAnalyzer).Parse("Airport"); 

BooleanQuery filterQuery = new BooleanQuery(); 
filterQuery.Add(query1, BooleanClause.Occur.MUST); 
filterQuery.Add(query1, BooleanClause.Occur.MUST); 

TopDocs results = searcher.Search(filterQuery); 

Я не тестировал код, но он должен работать.