2013-05-13 2 views
1

У меня есть индексированные документы. Они имеют содержание:Как получить список найденных слов с помощью Lucene.Net?

Документ 1:

Зеленый стол стоял в комнате. В комнате было мало.

Документ 2:

Зеленые столы стояли в комнате. Номер был большой.

Я ищу «зеленый стол». Я найду Document1 и Document2. Я хочу показать, какие фразы были найдены. Я нашел в первом документе - «зеленый стол». Я нашел во втором документе - «greens table». Как получить список найденных слов («зеленый стол» и «таблица зеленых»)? Я использую Lucene.Net версии 3.0.3.

+0

Вы хотите, чтобы выделить совпадающие слова в найденных документах? – rae1

+0

Не могли бы вы также добавить код для вашего поиска? –

ответ

1

Вы можете использовать маркер для обозначения «найденных слов». Если вы хотите найти их по другой причине, вы все равно можете использовать маркер и затем использовать регулярное выражение (или простой цикл подстроки) для извлечения слов.

Например:

Query objQuery = new TermQuery(new Term("content", strQuery)); 

QueryScorer scorer = new QueryScorer(objQuery , "content"); 

SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<b>","</b>"); 

highlighter = new Highlighter(formatter, scorer); 
highlighter.TextFragmenter = new SimpleFragmenter(9999); 

for (int i = 0; i < topRealtedDocs.ScoreDocs.Length; i++) 
{ 
    TokenStream stream = TokenSources.GetAnyTokenStream(searcher.IndexReader, topRealtedDocs.ScoreDocs[i].Doc, "content", analyzer); 

    string strSnippet = highlighter.GetBestFragment(stream, doc.GetValue("content")); 

    // here you can do what you want with the snippet. add it to your result or for example extract the words (not with a regex - this is just an example from here! use what ever you need): 
    List<string> foundPhrases = new List<string>(); 
    while (strSnippet.IndexOf("<b>") > -1) 
    { 
      int indexStart = strSnippet.IndexOf("<b>"); 
      int indexEnd = strSnippet.IndexOf("</b>"); 

      foundPhrases.Add(strSnippet.Substring(indexStart, indexEnd - indexStart)); 

      strSnippet = strSnippet.Substring(indexEnd); 

    } 
} 

Омри

+1

Спасибо, Омри. Я уже пришел к подобному решению. Я проверил скорость. – FetFrumos

Смежные вопросы