рекурсивно определить сходство в lucene

У меня есть коллекция книг на разных языках. Мне нужно связать части каждой книги друг с другом на основе их сходства. Мне нужно связать книги с похожими книгами, главы с похожими главами и подглавы с похожими подглавами.

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

Есть ли способ сообщить lucene, что документы в указателе следуют иерархической структуре, в которой книги состоят из глав, а главы состоят из подглав (которые являются фактическими документами для хранения)? Если это так, книги и главы могут быть созданы во время выполнения путем объединения документов, из которых они состоят. Есть ли у Lucene способ сделать это?

Одним из простых альтернативных подходов было бы создание отдельных индексов для каждого уровня разрешения, то есть один для книг, один для глав и один для подглав. Но это кажется неэлегантным, и я не уверен, что это будет работать хорошо, учитывая, что я получу разные значения частоты обратного документа в разных индексах. Это приводит к второстепенному вопросу: есть ли способ заставить lucene рассматривать только определенные документы в качестве эталонного класса для своих расчетов tf-idf?


person Florian Dietz    schedule 01.12.2014    source источник


Ответы (1)


Если количество уровней заранее определено, вы можете использовать функцию группировки http://lucene.apache.org/core/4_9_0/grouping/org/apache/lucene/search/grouping/package-summary.html

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

Существует также другой подход, с которым я столкнулся, - группировка идентификаторов документов в быстрой базе данных NoSQL, и когда lucene возвращает документ, вы можете искать идентификаторы похожих документов в NoSQL, а затем обратно в lucene. Однако такой подход может привести к другим проблемам (например, общему количеству попаданий, поскольку lucene возвращает общее количество попаданий даже без возврата результатов, но группировка, скорее всего, изменит это число.

person Michal Wilkowski    schedule 01.12.2014