Как определить, есть ли уже подобный документ в индексе Lucene? - PullRequest
3 голосов
/ 09 февраля 2010

Мне нужно исключить дубликаты в моей базе данных. Проблема в том, что дубликаты не считаются точным соответствием, а скорее похожими документами. Для этой цели я решил использовать FuzzyQuery следующим образом:

var fuzzyQuery = new global::Lucene.Net.Search.FuzzyQuery(
                     new Term("text", queryText),
                     0.8f,
                     0);
 hits = _searcher.Search(query);

Идея заключалась в том, чтобы установить минимальное сходство равным 0,8 (что, я думаю, достаточно высоко), чтобы были найдены только похожие документы, за исключением тех, которые недостаточно похожи.

Чтобы проверить этот код, я решил проверить, находит ли он уже существующий документ. Переменной queryText было присвоено значение, которое сохраняется в индексе. Код сверху ничего не нашел, другими словами, он не обнаружил даже точного соответствия.

Индекс был построен по этому коду:

 doc.Add(new global::Lucene.Net.Documents.Field(
            "text",
            text,
            global::Lucene.Net.Documents.Field.Store.YES,
            global::Lucene.Net.Documents.Field.Index.TOKENIZED,
            global::Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));

Я следовал рекомендациям, приведенным ниже, и результаты: TermQuery не возвращает никакого результата. Запрос с

 var _analyzer = new RussianAnalyzer();
 var parser = new global::Lucene.Net.QueryParsers
                .QueryParser("text", _analyzer);
 var query = parser.Parse(queryText);
 var _searcher = new IndexSearcher
       (Settings.General.Default.LuceneIndexDirectoryPath);
 var hits = _searcher.Search(query);

Возвращает несколько результатов с максимальным баллом для документа с точным соответствием и других документов с аналогичным содержанием.

Ответы [ 3 ]

2 голосов
/ 09 февраля 2010

Это может помочь заглянуть внутрь индекса - четко покажет, к каким данным вы запрашиваете, и как Lucene «видит» ваши данные. Для этого вы можете использовать Luke . У него есть некоторые известные проблемы совместимости с Lucent.NET, но в любом случае он намного лучше, чем ничего.

1 голос
/ 02 апреля 2010

Попробуйте MoreLikeThis класс в Lucene ... он имеет несколько закодированных эвристик, которые помогут вам идентифицировать "похожие" документы.

1 голос
/ 10 февраля 2010

Я вторая рекомендация для Люка. Несколько других вещей, чтобы попробовать:

  1. Сначала попробуйте точный запрос, скажем, TermQuery для термина "текст". Если это не сработает, нечеткий запрос не будет.
  2. Используйте Explain () , чтобы увидеть, как прошел подсчет очков (при условии, что вы получаете другие попадания).
  3. Следуйте советам Отладка проблем релевантности в поиске .
...