2009-05-12 12 views
11

Je ne parviens pas à la recherche d'une expression exacte à l'aide Lucene.NET 2.0.0.4recherche Phrase exacte en utilisant Lucene.net

Par exemple, je suis à la recherche de « attribut scope définit la variable » (y compris les guillemets) mais pas recevoir matches, j'ai confirmé 100% que la phrase existe. Est-ce que quelqu'un peut suggérer où je me trompe? Est-ce que cela est même supporté par Lucene.NET? Comme d'habitude, la documentation de l'API n'est pas trop utile et quelques articles de CodeProject que j'ai lus ne traitent pas spécifiquement de cela.

En utilisant le code suivant pour créer l'index:

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

je recherche alors une phrase en utilisant:

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

Le document cible est d'environ 7 Mo texte brut.

J'ai vu ce previous question mais je ne veux pas une recherche de proximité, juste une recherche d'expression exacte.

Répondre

13

Vous n'avez pas activé les positions à terme. Créer un champ comme suit devrait résoudre votre problème.

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, vous devez activer les positions à long terme ...

Cependant, je ne recommanderais pas stocker le texte du document dans le domaine, sauf si vous avez absolument besoin pour revenir de nouveau à vous dans la recherche résultats ... Mettre le magasin à 'NON' pourrait aider à réduire un peu la taille de votre index.

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