2010-02-02 6 views
5

Je veux effectuer une recherche multi-champs sur un index lucene.net mais filtrer les résultats en fonction de l'un des champs. Voici ce que je suis en train de faire:Comment utiliser multifieldquery et filtres dans Lucene.net

Pour indexer les champs, les définitions sont:

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)); 

Lorsque j'effectue la recherche que je fais ce qui suit:

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); 

Cependant, le résultat est toujours 0 résultats

Qu'est-ce que je fais mal?

Répondre

6

Je pense que j'ai maintenant une solution. J'ai supprimé l'utilisation de QueryFilter et j'utilise une requête booléenne pour contraindre les résultats avant MultiFieldQuery. Le code ressemblera à ceci:

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

Si le texte cible recherché est "box fox", et le terme de recherche entré par un client est seulement box, comment obtenez-vous que lucene déclenche une correspondance pour le "box fox" doc? –

Questions connexes