2012-02-16 3 views
0

извините за мой плохой английский, я могу читать лучше, чем писать;)Lucene.net - нужно найти похожие фразы в индексе

Я реализовал Lucene.Net в приложении, где РМКО извлечение клеток из листа первенствовать в тексте и записать их в индекс. После этого я искал индекс с фразами, которые содержат около 250 букв и записывают результат в приложение. Теперь это работает отлично, если фраза точно такая же, как в индексе. Мой вопрос сейчас: есть ли шанс найти результаты, если некоторые буквы изменились? Тем не менее, я должен найти квоты, если кто-то удаляет только одно слово в предложении.

Я использую Apache-Lucene.Net-2.9.4 и важную информацию:

//used analyzer and IndexWriter 
analyzer = new Lucene.Net.Analysis.De.GermanAnalyzer(); 
writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); 

//Used Field Properties 
doc.Add(new Field("id", txts.ToString(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES)); 
doc.Add(new Field("DateiName", DateiName, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES)); 
doc.Add(new Field("postBody", text, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES)); 

for (int y = 1; y < 51; y++) 
{ 
    var queryParser = new QueryParser(Version.LUCENE_29, "postBody", analyzer); 
    string temquery = "\""; 
    temquery += sheet.Cells[y, 5].Value.ToString(); 
    temquery += "\""; 
    var query = queryParser.Parse(temquery); 
    TopDocs resultDocs = indexSearch.Search(query, indexReader.MaxDoc()); 
    var hits = resultDocs.ScoreDocs; 
    if (resultDocs.TotalHits > 0 && resultDocs.MaxScore > 1) 
    { 
     foreach (var hit in hits) 
     { 
      found = true; 
      var documentFromSearcher = indexSearch.Doc(hit.doc); 
      combineString += "Zeile: " + documentFromSearcher.Get("id") + 
        "\t" + documentFromSearcher.Get("DateiName") + "\t Zeile: \t" + 
        y.ToString() + "\r\n"; 
      tbAusgabe.Text = combineString; 
     } 
    } 
} 

Я попробовал несколько анализаторов, много читал о маркерах и полевых свойствах, но я не нашел решение. Кто-нибудь здесь может мне помочь?

+1

Несколько примеров текста, показывающих *, что вы указали *, * то, что вы ищете * и *, что вы хотите найти *, было бы хорошо. –

ответ

0

Вы можете использовать fuzzy query или приблизительный запрос.

Например, "foo bar"~1 будет соответствовать bar foo и foobar~.5 будет соответствовать foobaz.

+0

Обратите внимание, что «foo bar» ~ 1 создаст обычный PhraseQuery со словом 1, который не будет соответствовать, если отсутствует токен, см. Http://lucene.apache.org/core/old_versioned_docs/versions/2_9_4/api /all/org/apache/lucene/search/PhraseQuery.html#setSlop(int) –