2009-05-12 17 views
11

Tengo problemas para buscar una frase exacta usando Lucene.NET 2.0.0.4buscar frase exacta usando Lucene.net

Por ejemplo Estoy buscando "atributo scope establece la variable" (incluyendo las comillas), pero no recibirán coincidencias, he confirmado al 100% que la frase existe.

¿Alguien puede sugerirme dónde me estoy equivocando? ¿Esto incluso es compatible con Lucene.NET? Como es habitual, la documentación de la API no es demasiado útil y algunos artículos de CodeProject que he leído no abordan específicamente esto.

Usando el siguiente código para crear el índice:

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

que luego buscar una frase usando:

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

El documento de destino es de unos 7 MB de texto sin formato.

He visto esto previous question Sin embargo, no quiero una búsqueda de proximidad, solo una búsqueda exacta.

Respuesta

13

No ha habilitado el término posiciones. Crear el campo de la siguiente manera debería resolver su 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, necesita habilitar posiciones plazo ...

Sin embargo, yo recomendaría no almacenar el texto del documento en el campo a menos que sea absolutamente necesario que vuelva de nuevo a usted en la búsqueda resultados ... Establecer la tienda en 'NO' podría ayudar a reducir un poco el tamaño de su índice.

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