Может ли Lucene вернуть несколько результатов поиска из одного проиндексированного файла? - PullRequest
8 голосов
/ 18 ноября 2009

Я использую Lucene для индексации и поиска небольшого количества больших документов. Используя демо с сайта Lucene, я проиндексировал документы и могу найти их. Однако результат поиска не особенно полезен, так как он указывает на файл документа. С очень большими документами это не особенно полезно.

Мне интересно, может ли Lucene проиндексировать эти очень большие документы и создать над ними абстракцию, обеспечивающую гораздо более детальные результаты.

Пример может лучше объяснить, что я имею в виду. Рассмотрим очень большую книгу, такую ​​как Библия. В одном файле содержится весь текст Библии, поэтому в демоверсии результат поиска, скажем, «Дамаск» будет указывать на файл. Я хотел бы сохранить большой документ, но результаты поиска будут возвращать результаты, указывающие на книгу, главу или даже точную, как стих. Таким образом, поиск «Дамаска» может вернуть (среди прочего) Книгу 23, Главу 7, Стих 8.

Возможно ли это (и рекомендуется использовать Lucene), или я должен вместо этого попытаться разделить большой документ на множество небольших файлов для индексации?

Если это имеет какое-либо значение, я использую Java Lucene 2.9.0 и индексирую файлы HTML размером примерно 1–4 МБ. Который с точки зрения размера файла не большой, но он большой по сравнению с человеком, который его читает.


Не думаю, что объяснил это так хорошо, как мог. Вот еще один пример.

Скажем, я беру свой большой HTML-файл, и (ради аргументов) поисковый термин "Дамаск" встречается 3 раза. Один раз в строке 100 внутри тега <div>, в строке 2000 внутри тега <p> и в строке 5000 внутри тега <h1>. Можно ли индексировать с помощью Lucene так, чтобы было 3 результата, и они могли указывать на конкретный элемент, в котором находился термин?

Не думаю, что я хочу предоставить другой результат документа для этого термина. Поэтому, если термин «Дамаск» встречается дважды в определенном <div>, совпадение будет только одно.

Из комментария от Kragen следует, что я хотел бы проанализировать HTML, когда Lucene проходит фазу индексации. Затем я могу решить, какой фрагмент я хочу считать одним документом из того, что читает парсер. Поэтому, если я вижу div с определенным классом, я могу начать новый документ Lucene, и он будет возвращен в качестве отдельного попадания при поиске слова в содержимом div.

Похоже ли это на то, что я хочу сделать, и возможно ли это?

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

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

Существует дополнение Lucene.Highlight, которое выполняет именно эту задачу для вас - попробуйте эту статью , есть также несколько вопросов по StackOverflow, касающихся выделения совпадений (многие из них специально предназначены для использования с веб-приложениями и так далее, например, окружая соответствующие слова тегами <b>)

ОБНОВЛЕНИЕ: В зависимости от того, как вы выполняете поиск по индексу, вы также можете найти, что неплохо бы разбить ваши большие документы на более мелкие разделы (например, главы) - однако это больше вопрос как вы хотите организовать, расставить приоритеты и представить свои результаты конечному пользователю.

Например, предположим, что пользователь выполняет поиск по слову "foo", и есть 2 книги, содержащие этот термин. Первая книга (книга A) может содержать 2 главы, в каждой из которых есть много ссылок на «foo», однако термин почти не упоминается в остальной части книги, однако вторая книга (книга B) содержит много ссылок на «foo». Однако они разбросаны по всей книге. Если вы индексируете по книге, то вы, вероятно, обнаружите, что книга B является первым хитом, однако при индексации по главам вы, вероятно, обнаружите, что 2 главы из книги A - это первые 2 попадания, за которыми следуют главы из книги B. 1012 *

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

0 голосов
/ 18 ноября 2009

Один из способов сделать это - создать несколько документов из одной книги. Документы могут представлять книги, главы или стихи. Поскольку текст не должен быть уникальным, это то, что я бы сделал. Таким образом, первый стих в первой главе книги Бытия будет проиндексирован четыре раза: во всей Библии, в книге Бытия, в первой главе и как стих.

Тонкость здесь - точная цель поиска: Вы хотите просто отобразить ключевые слова поиска в контексте для пользователя? В этом случае рассмотрите возможность использования подсветки Lucene . Если вам нужно, чтобы поиск использовался в дальнейшем (например, возьмите извлеченный указатель на главу или стих и выполните некоторую обработку этого места в тексте), я бы пошел с более детализированными документами, как я описал ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...