Поиск фразы в индексе со стеммингом


#1

Доброго времени суток!
Есть индекс и поле в нем построенное со стеммингом.
Не получается сделать поиск полной фразы.
Т.е. на пример, надо найти точно "Электронный документ".
Как ни пытался - ES первым выводит более длинное значение, какой-нибудь "Справочник по электронному документообороту".
Возможно ли это побороть или переделывать индексы?
А если переделывать как правильно?
Ведь получается, что нужны и полные слова и "обрезки".
Целые для поиска точных фраз и обрезки для всяких не точных поисков.
Или вообще по другому делается?


(Igor Motov) #2

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


#3

Отлично! Большое спасибо. В приведенном примере my_type сразу два аналайзера применяется, дополнительных движений не нужно?


(Igor Motov) #4

Нужно. Запрос на следующем слайде.


#5

Ну про это то я догадался :slight_smile:
Я имел ввиду, что при индексации не надо данные в два поля посылать:
put /my_index/my_type
{ "my_text": "some text",
"my_text.with_synonyms": "some text"
}


(Igor Motov) #6

Да, оба поля будет созданы автоматически из одного поля исходного документа.


#7

А имеет смысл вырезать стоп слова из оригинальных токенов (без синонимов)?


(Igor Motov) #8

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

Единственный случай, когда стоп-слова действительно полезны, с моей точки зрения, это если надо чтобы детишки в школе матерные слова в индексе не могли найти, а контролировать, что в индекс добавляется не возможности. В этом случае, добавляешь мат в файл, грузишь как стоп слова, и все - дешево и сердито. Но, опять-же, в английском, это все просто делается, а в русском - все надо через стеммер пропускать, чтобы многоэтажный мат отловить.


#9

Я поэтому и спрашиваю, что пресловутое "быть или не быть", как фразу не найти.
Вот и выходит, что первый индекс должен быть просто "standard", а второй более хитрый.
И пока я думаю, что должен стандартный токенайзер, а дальше фильты
lowcase ->stop_word -> keyword -> russian_morphology -> engilish_morphlogy -> synonym

  1. lowcase - чтобы потом не заботиться о регистре написания
  2. stop_word. - т.к. они в первом индексе есть тут их можно нещадно резать.
  3. keyword - для всяких исключений и сокращений: СССР, КГБ, ЯрГУ
  4. russian_morphology - как минимум, мне не понравилось как стеммер swonball с русскими фамилиями работает.
  5. engilish_morphlogy - до кучи
  6. synonym - синонимы в нормальной форме.

Есть конечно еще некоторые сомнения:

  1. Резать ли цифры? Их же много. Но ведь найдется гений, который будет искать организацию по ИНН.
  2. Нужны ли nGram-ы для всяких нечетких поисков. Если нужны то получается, нужно делать третий индекс. Ибо по опыту сочетание стеммера и nGram даёт не однозначный результат.

В общем, если есть мудрость поделитесь :slight_smile:
Понятно, что у всех свои нюансы, но ведь есть общие принципы которые подойдут 98%% задач по поиску в русском тексте.


(Igor Motov) #10

Как я пытался объяснить в предыдущем сообщении stop_word перед стеммером работать не будет, если только вы все возможные словоформы для каждой лексемы туда на добавите. Поэтому обычно делают так lowercase -> keyword -> russian_morphology -> engilish_morphlogy -> stop_word -> synonym

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

  2. Да, nGram со стеммером применять бессмысленно, так как они и тот и другой выполняет по-сути одну и туже функцию. Если поиск по подстрокам нужен, лучше проиндексировать еще раз.


#11

До редактирования поста так и было :slight_smile:
А потом пришла такая мысль:

  1. Составить достаточно полный словарь задача посильная.
  2. Сложность зависит (почти) только от объема входных данных
  3. Если количество stop слов 30%, то объем на выходе на треть меньше.
  4. Поэтому вырезать сразу лишнее интереснее.

Получается, что если нужен поиск по подстрокам, то нет смысла вообще связываться со стеммером и морфологическим разбором?


(Igor Motov) #12

Для меня это взаимозаменяемые решения. Выбор решения зависит от типа и объема данных (ngrams производят больше токенов и размер индекса, как правило получается больше) и предпочтений пользователей (некоторые пользователи предпочитают подстроки, потому что им так проще понять почему они получили тот или иной результат).


(system) #13

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.