fts индексация на уровне документа, получение результатов на уровне страницы (на примере dtSearch)
Это не обязательно вопрос, специфичный для dtSearch (например, это больше похоже на вопрос о fts-engine), но он касается способа индексации документов, состоящих из нескольких страниц, и получения результатов попаданий на уровне страниц.
Я гуглил, искал и ничего не нашел, отсюда и мой вопрос:
У нас есть несколько отсканированных страниц из m книг. Мы OCR-них, полнотекстовые индексировать их и выполнить поиск.
Мы хотим, чтобы результаты поиска были на уровне книги (например, результат поиска должен содержать одну книгу), а также чтобы можно было получать найденные элементы на уровне страницы (чтобы иметь возможность эффективно выполнять выделение совпадений, например, термин SomeTerm был найден на странице 1, странице 2 и странице 7).
И тут возникает проблема:
- если мы индексируем текст страниц по одной за раз, и Page 1 из BookA содержит термин Term1, а Page2, также из BookA, содержит термин Term2, поисковый Term1 и Term2 не даст никаких результатов, что является нормальным
- если мы проиндексируем текст всех страниц в одном большом текстовом блоке, все принадлежащие одной и той же книге, мы не сможем получить страницу, к которой принадлежит найденный термин.
В dtSearch Desktop есть такая функция для индексации PDF: он может индексировать текст всех страниц из одного документа, но также может сообщать страницу, на которой произошло попадание, используя символ %%Page%%.
Мы используем пользовательский источник данных для подачи в индексатор, но мы не можем определить структуру документа, которая будет использоваться для достижения желаемого результата.
Если бы вы использовали любой другой движок fts (например, Lucene/Sphinx), как бы вы подошли к вышеупомянутой проблеме (с риском повторения):
- Вам нужно проиндексировать содержимое страниц
- Страницы логически сгруппированы в документы
- Вам необходимо получить результаты по документу
- Результаты выделения должны содержать номер страницы
Спасибо за любые предложения, Джордж
PS: простите за длинное сообщение
2 ответа
Как пользователь dtsearch в течение долгого времени, я думаю, что вернусь к основам, генерируя и индексируя постраничный pdf-файл, каждая страница которого соответствует текстовой странице ocr вашей книги.
Таким образом, вы полностью независимы от технологии поисковой системы, позволяя ей делать то, что лучше всего работает в хорошо известном формате PDF.
Ваш индекс не будет переполнен бессмысленными одностраничными документами, количество которых нарушит порядок наилучшего результата при поиске книг.
Надеюсь, что это поможет, и извините за мой сломанный английский
Подход грубой силы будет иметь два типа проиндексированных документов:
- Документы уровня страницы с текстом страницы, номером страницы, названием книги и флажком, указывающим, что это документ уровня страницы.
- Документы уровня книги с текстом книги, названием книги и флажком, указывающим, что это документ уровня книги.
Сначала вы будете искать только документы на уровне книг, чтобы найти подходящие книги. Затем вы должны искать только в документах на уровне страницы соответствующие книги, чтобы найти соответствующие документы на уровне страницы. Это позволило бы вам сказать, что "термин X и термин Y появляются в книге Z, а термин X на страницах 2, 47 и 293 и термин Y появляются на страницах 1, 3, 5 и 293."
Одним из недостатков этого подхода является то, что вы в конечном итоге индексируете содержимое каждой страницы дважды.