2016-01-07 3 views
0

Я реализовал функцию поиска для своего сайта электронной коммерции, используя эластичный поиск. Базовая структура похожа: каждый продукт имеет название и независимо от того, что пользователь вводит, я ищу точную строку, используя эластичность, и возвращаю результат.Реализация поиска: Идентификация известных ключевых слов

Теперь я замечаю, что большинство поисковых фраз (почти 90%) следуют аналогичной схеме. Он содержит:

  1. Фирменное наименование продукта (Apple, Nokia и т.д.)
  2. Категория продукта (телефон, мобильный телефон, смартфон и т.д.) имя
  3. Модель продукта (iPhone 6S, Lumia 950 и т. Д.)

Теперь я думаю, что если я смогу идентифицировать конкретные компоненты, тогда я смогу вернуть лучшие результаты, чем просто совпадение текста.

У меня есть список брендов, категорий и моделей. Если я могу определить присутствующие термины, тогда я могу запросить elasticsearch с этим полем конкретно Например, строка поиска «Apple iPhone 5S», я должен уметь вывести этот бренд = Apple.

EDIT: Более подробную информацию, как просили в комментариях

Структура документа:

У меня есть один индекс и каждый документ ID является SKU продукта и содержит следующие поля

  1. название (Apple iPhone 5S)
  2. бренд (Apple)
  3. Катег (Электроника)
  4. sub_categ (смартфоны)
  5. модель (iPhone 5S)
  6. attribs (словарь атрибутов продукта частности к каждому sub_categ как { "цвет": "золото", "память": «32 GB " "батарея": "1570 мАч"})
  7. цены

Use Case:

Теперь, когда пользователь ищет фразу" айфон- s battery ", эластичный результат поиска результатов, который возвращает даже телефон. (Я согласен, что совпадение соответствия соответствует лучшим для батареи)

То, чего я пытаюсь достичь, у меня есть главный список подкатегорий. Поэтому, если в главном списке присутствует какое-либо слово из поисковой фразы, я бы выполнил поиск по elasticsearch с запросом ["must": {"sub_categ": "battery"}]. Таким образом, результат подкатегории «Смартфоны» не будет получен из резины. Я хочу воспроизвести это по нескольким полям, таким как бренд, категория и т. Д.

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

+0

Вы можете поделиться своими картами? также какие результаты (документы) вы хотели бы вернуть для запроса «Apple iPhone 5S»? – ChintanShah25

+0

В чем ваш вопрос? Вы можете обозначить свою строку и ссылаться на индекс бренда/категории/модели. Но как это может помочь вам в поисках поискового запроса? – Sobrique

+0

@ ChintanShah25 отредактировал вопрос с подробностями – Sriram

ответ

1

Человек в мире Люцен, который больше всего на эту тему говорил, это Тед Салливан. (Он называет это «автофильтрацией» и имеет a component which does this available for Solr)

Я понимаю, что вы используете Elasticsearch, но компонент Ted работает, исследуя данные FieldCache (выставленные Lucene), поэтому должно быть возможно реализовать нечто очень похожее на Elasticsearch (посмотрите на код).

Существует также обсуждение в this article о том, как создать отдельный индекс для предоставления интеллектуального интеллекта перед запросом, как вы описали (например, ваш термин «Apple» чаще всего находится в поле company).

+0

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

+0

Да. На данный момент это настраиваемые функции. Если вы не хотите программировать против Lucene, попробуйте выполнить второй подход в статье (где вы сохраняете вторичный индекс с «термином» и «встречающимися полями + подсчеты» для предварительного запроса) –

Смежные вопросы