Индексирование документов с уценкой для полнотекстового поиска в Apache SOLR



Я использую Apache SOLR для индексации документов с уценкой.
Как вы знаете, Markdown - это в основном простой текст со специальными тегами для форматирования, такими как полужирный и курсив. Проблема в том, что если у Markdown выделено жирным шрифтом или курсивом, полнотекстовый поиск не работает. Однако, если в документе с уценкой нет элементов форматирования (жирный шрифт, курсив или заголовок, ссылки и т. Д.) - работает полнотекстовый поиск. Подводя итог, это работает, когда документ уценки такой же, как и обычный текст (т.е. ни одно слово не имеет форматирования уценки).

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

Я искал и читал на разных форумах в Интернете. Думаю, мне нужно реализовать собственный анализатор. Пользовательскому анализатору необходимо сначала преобразовать разметку в открытый текст, а затем проиндексировать ее. Я думаю, что эта ситуация похожа на то, что Apache Tika делает для документов Microsoft. Он анализирует офисные документы MS и извлекает простой текст. Думаю, мне нужно подобное.
Я думаю и о документах с уценкой - мне нужно проанализировать и преобразовать в простой текст.
Я уже нашел способ преобразовать разметку в открытый текст.

Однако я не уверен, действительно ли мне нужно создавать собственный анализатор. Я читал код для пользовательских анализаторов - но все они используют tokenFilters. Насколько я понимаю, tokenFilters работают с потоком по токенам. В моем случае весь markdown корпус нужно преобразовать в plain text. Итак, пожалуйста, предложите подход к этому.

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

  1. Должен ли я создавать custom analyzer для сохранения markdown документов в plain text? Или требуется custom query parser?
  2. Может ли кто-нибудь дать пример кода для того же (псевдокод тоже подойдет).

Пожалуйста помоги.


person Chetan Yewale    schedule 30.09.2018    source источник
comment
Я не вижу причин, по которым StandardTokenizer не должен давать вам правильные токены без Markdown (так как он разделится и отбросит большинство не буквенно-цифровых символов). Какая часть синтаксиса уценки не работает?   -  person MatsLindh    schedule 30.09.2018
comment
@MatsLindh, я разобрался в проблеме. Я использовал только WhiteSpaceAnalyzer. WhiteSpaceAnalyzer был просто токенизирован на основе пробелов, но не на специальных символах, таких как * или ## в уценке. Я вижу, что для моего варианта использования - StandardTokenizerFactory идеально - поскольку токенизатор будет разбивать пробелы, а также не буквенно-цифровые символы, как упомянуто вами. Я внес это изменение - теперь поиск работает, как ожидалось.   -  person Chetan Yewale    schedule 01.10.2018


Ответы (1)


Используйте StandardTokenizer - он разделит большинство нечисловые символы, которые должны подходить для индексации Markdown как отдельных терминов, а не с сохранением синтаксиса Markdown.

Этот токенизатор разбивает текстовое поле на токены, обрабатывая пробелы и знаки препинания как разделители. Символы-разделители отбрасываются, за следующими исключениями:

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

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

Если вы хотите разделить периоды между словами, вы можете использовать PatternReplaceCharFilterFactory, чтобы вставить пробел после слов, разделенных точкой без пробелов.

person MatsLindh    schedule 01.10.2018