2011-10-23 11 views
5

bien, he buscado esto en las últimas dos horas con resultados que solo dan consejos, y ni siquiera un código completo para el rescate (cómo aprenderían noobs si no pueden ver algunos ? muestras)Lucene - buscando un campo de valor numérico

i han creado un índice de este modo:

Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(Server.MapPath("/data/channels/"))); 
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); 
IndexWriter writer = new IndexWriter(directory, analyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED); 
Document doc = new Document(); 
doc.Add(new Field("ID", "0", Field.Store.YES, Field.Index.NO)); 
doc.Add(new Field("parentID", "0", Field.Store.YES, Field.Index.NO)); 
doc.Add(new Field("Title", "Root", Field.Store.YES, Field.Index.ANALYZED)); 
writer.AddDocument(doc); 
writer.Optimize(); 
writer.Close(); 

Ahora, quiero buscar el campo ID Cuando el valor es igual a 0 (para obtener el registro único que tengo allí) ...

pero, una búsqueda simple como esta:

Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(Server.MapPath("/data/channels"))); 
Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Version.LUCENE_29); 
Searcher searcher = new Lucene.Net.Search.IndexSearcher(IndexReader.Open(directory, true)); 
Query query = new Lucene.Net.QueryParsers.QueryParser(Version.LUCENE_29, "ID", analyzer).Parse("0"); 
Hits hits = searcher.Search(query); 

devuelve ningún resultado. He leído sobre NumericRange, KeywordAnalyzer y algunas cosas más, pero dado que ninguno de ellos proporciona una muestra, no pude encontrar la manera de hacerlo.

por favor, personas amables, denme un ejemplo de cómo hacer que esto funcione.

Respuesta

7

Cambio Field.Index.NO a Field.Index.ANALYZED (o Field.Index.NOT_ANALYZED) en el campo ID

9

he utilizado NumericField y una NumericRangeQuery para buscar índices de Lucene para los números.

Al crear el índice:

NumericField taxonRankSortOrder = new NumericField("TaxonRankSortOrder", Field.Store.YES, true); 
    taxonRankSortOrder.SetIntValue(rank); 
    document.Add(taxonRankSortOrder); 

Y a continuación, utilizando una consulta:

NumericRangeQuery query = NumericRangeQuery.NewIntRange("TaxonRankSortOrder", 3000, 3000, true, true); 

devolverá todos los documentos con un TaxonRankSortOrder igual a 3000.

Tienes que crear la consulta usted mismo en lugar de utilizar un QueryParser, por lo que estaría interesado en ver si también hay un mejor enfoque.

+4

Si solo está buscando una sola int, no necesita buscar por rango. Simplemente use esto: TermQuery query = new TermQuery (nuevo Término ("TaxonRankSortOrder", NumericUtils.IntToPrefixCoded (3000))); –

Cuestiones relacionadas