2011-10-23 15 views
5

ok, ho cercato questo nelle ultime due ore con risultati che danno solo suggerimenti, e nemmeno un codice completo in soccorso (come imparerebbero i noob se non possono vederli ? campioni)Lucene - alla ricerca di un campo del valore numerico

ho creato un indice in questo 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(); 

Ora, voglio cercare il campo ID Se il valore è uguale a 0 (per ottenere il singolo record che ho lì) ...

ma, una semplice ricerca come questa:

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

non restituisce risultati. ho letto su NumericRange, KeywordAnalyzer e altre cose, ma poiché nessuno di loro fornisce un campione non riuscivo a capire come farlo.

per favore, gente gentile, dammi un esempio di come far funzionare questa cosa.

risposta

7

Change Field.Index.NO-Field.Index.ANALYZED (o Field.Index.NOT_ANALYZED) nel campo ID

9

Ho usato NumericField e un NumericRangeQuery per cercare gli indici Lucene per i numeri.

Quando si crea l'indice:

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

e quindi utilizzando una query:

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

restituirà tutti i documenti con un TaxonRankSortOrder pari a 3000.

È necessario creare la query te stesso piuttosto che utilizzare un QueryParser, quindi sarebbe desideroso di vedere se c'è un approccio migliore pure.

+4

Se stai cercando un singolo int, non è necessario cercare per intervallo. Basta usare questo: Query TermQuery = nuovo TermQuery (nuovo Termine ("TaxonRankSortOrder", NumericUtils.IntToPrefixCoded (3000))); –

Problemi correlati