Как проиндексировать это поле в ElasticSearch?

Я хочу проиндексировать следующее поле:

quick brown fox

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

Другими словами, я хочу создать индекс / запрос, чтобы верно следующее:

# input for field
quick brown fox

# hits
brown fox quick
fox quick brown
quick brown fox
...

# misses
quick brown
fox
quick brown fox red
...

Похоже, для этого мне пришлось бы создать собственный токенизатор. Токенизатор, который разбивает входной поток на эти перестановки ключевых слов. Я не знаю, с чего начать. Я использую рубин / шину. Это правильная идея? Как мне создать собственный токенизатор?


person Dane O'Connor    schedule 17.07.2013    source источник
comment
Разве нельзя просто использовать запрос на сопоставление с оператором AND, чтобы все термины в запросе появлялись в соответствующих документах? Порядок не будет учитываться, если вы не сделаете запрос, который учитывает такие позиции, как запрос фразы или запрос диапазона. Я что-нибудь упускаю?   -  person javanna    schedule 17.07.2013
comment
@javanna Нет, не думаю, что смогу. Если я вас правильно понимаю, не будет ли запрос «лиса» соответствовать полю «быстрая коричневая лиса»? Я пытаюсь создать индекс, в котором «fox» не соответствует полю «quick brown fox», поскольку пользователь не включил quick или brown в запрос. Есть смысл?   -  person Dane O'Connor    schedule 17.07.2013
comment
Да, у меня было ощущение, что я чего-то упускаю. Возможно, вы сможете более четко указать в своем вопросе, что это запросы, которые должны или не должны соответствовать документу. В любом случае, не знаю, каков вариант использования ... да, вам действительно нужно создать свой собственный токенизатор, не уверен, что вы можете достичь того, чего хотите, комбинируя существующие. Что ты пробовал?   -  person javanna    schedule 17.07.2013


Ответы (1)


Я бы отсортировал эти слова в алфавитном порядке, объединил бы их вместе, используя какой-нибудь разделитель, который не мог появиться в словах, и проиндексировал бы их как один непроанализированный токен. Таким образом, quick brown fox будет проиндексирован как brown-fox-quick. Вам нужно будет выполнить эту операцию как во время индексации, так и во время поиска. В идеале это делал бы анализатор, но я не знаю ни одного анализатора, который сделал бы что-то подобное за вас. Поэтому вам нужно написать свой собственный анализатор (как плагин java) или реализовать эту логику в своем коде за пределами elasticsearch.

person imotov    schedule 18.07.2013
comment
Классная идея. Мне нравится простота упорядочивания по индексу И по времени запроса по сравнению с моим первоначальным мышлением. - person Dane O'Connor; 19.07.2013