2010-02-02 667 views
5

Quiero realizar una búsqueda en varios campos en un índice lucene.net pero filtrar los resultados según uno de los campos. Esto es lo que estoy haciendo actualmente:Cómo usar multifieldquery y filtros en Lucene.net

Para indexar los campos de las definiciones son:

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

Al realizar la búsqueda hago lo siguiente:

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

Sin embargo, el resultado es siempre 0 visitas.

¿Qué estoy haciendo mal?

Respuesta

6

Creo que ahora tengo una solución. He descartado el uso de QueryFilter y estoy usando una consulta booleana para restringir los resultados antes de MultiFieldQuery. Así que el código se verá algo como esto:

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 el texto de destino que se busca es "caja de zorro", y el término de búsqueda introducido por un cliente es única caja, ¿cómo se consigue Lucene para desencadenar un partido para el "caja zorro" doc? –