2009-05-12 9 views
11

Sto avendo difficoltà a cercare una frase esatta utilizzando Lucene.NET 2.0.0.4esatta cerca categoria utilizzando Lucene.net

Per esempio io sto cercando "scope imposta la variabile" (tra cui le virgolette), ma non ricevere partite, ho confermato al 100% che la frase esiste.

Qualcuno può suggerire dove sto andando male? È supportato anche con Lucene.NET? Come al solito, la documentazione dell'API non è di grande aiuto e alcuni articoli di CodeProject che ho letto non lo riguardano in modo specifico.

utilizzando il seguente codice per creare l'indice:

Directory dir = Lucene.Net.Store.FSDirectory.GetDirectory("Index", true); 

Analyzer analyzer = new Lucene.Net.Analysis.SimpleAnalyzer(); 

IndexWriter indexWriter = new Lucene.Net.Index.IndexWriter(dir, analyzer,true); 

//create a document, add in a single field 
Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document(); 

Lucene.Net.Documents.Field fldContent = new Lucene.Net.Documents.Field(
    "content", File.ReadAllText(@"Documents\100.txt"), 
    Lucene.Net.Documents.Field.Store.YES, 
    Lucene.Net.Documents.Field.Index.TOKENIZED); 

doc.Add(fldContent); 

//write the document to the index 
indexWriter.AddDocument(doc); 

Ho poi cercare una frase utilizzando:

//state the file location of the index 
Directory dir = Lucene.Net.Store.FSDirectory.GetDirectory("Index", false); 

//create an index searcher that will perform the search 
IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(dir); 

QueryParser qp = new QueryParser("content", new SimpleAnalyzer()); 

// txtSearch.Text Contains a phrase such as "this is a phrase" 
Query q=qp.Parse(txtSearch.Text); 


//execute the query 
Lucene.Net.Search.Hits hits = searcher.Search(q); 

Il documento di destinazione è di circa 7 MB testo normale.

Ho visto questo previous question tuttavia non desidero una ricerca di prossimità, solo un'esatta ricerca di frasi.

risposta

13

Non è stato abilitato il termine posizioni. La creazione del campo come segue dovrebbe risolvere il tuo problema.

Lucene.Net.Documents.Field fldContent = 
    new Lucene.Net.Documents.Field("content", 
     File.ReadAllText(@"Documents\100.txt"), 
    Lucene.Net.Documents.Field.Store.YES, 
    Lucene.Net.Documents.Field.Index.TOKENIZED, 
    Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS); 
14

Shashikant Kore is correct with his answer, è necessario attivare le posizioni termine ...

Tuttavia, mi sento di raccomandare non memorizzare il testo del documento nel campo a meno che non è assolutamente necessario per tornare di nuovo a voi nella ricerca risultati ... L'impostazione del negozio su "NO" potrebbe aiutare a ridurre un po 'la dimensione dell'indice.

Lucene.Net.Documents.Field fldContent = 
    new Lucene.Net.Documents.Field("content", 
     File.ReadAllText(@"Documents\100.txt"), 
    Lucene.Net.Documents.Field.Store.NO, 
    Lucene.Net.Documents.Field.Index.TOKENIZED, 
    Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS);