Внедрение поисковых подсказок на основе Elasticsearch

задняя часть база данных Elasticsearch

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

описание проблемы

Поиск на веб-сайтах электронной коммерции является одной из самых основных и важных функций.Хорошее взаимодействие с окном поиска может принести большую пользу электронной коммерции.Давайте сначала рассмотрим предложения по поиску на Taobao, JD.com и Amazon. .ком.

При вводе [Свитер] в поле поиска Taobao подсказки для поиска ниже включают предлагаемые слова и связанные теги:
淘宝的搜索建议

Когда вы входите [Свитер] в поле поиска Jingdong, следующий поиск предполагает, что право отобразить количество рекомендуемого слова:
京东的搜索建议

Когда вы вводите [Свитер] в поле поиска Amazon, верхняя часть предложения поиска может поддерживать поиск по определенной категории:
亚马逊的搜索建议

Из приведенного выше сравнения видно, что разные компании электронной коммерции немного по-разному акцентируют внимание на поисковых подсказках, но основные проблемы включают в себя:

  • Сопоставление: сопоставление префиксов может быть выполнено с помощью пользовательского ввода;
  • Сортировать: сортировать по приоритету предлагаемых слов;
  • Агрегация: ее можно агрегировать в соответствии с продуктами, связанными с предлагаемыми словами, такими как классификация агрегации, метка агрегации и т. д.;
  • Исправление ошибок: возможность исправлять орфографические ошибки пользовательского ввода;

Реализация поискового предложения

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

SuggestionDiscovery

  • SuggestionDiscovery отвечает за обнаружение предлагаемых слов;
  • Источником предлагаемых слов может быть название категории продукта, название бренда, этикетка продукта, высокочастотные слова названия продукта, популярные поисковые слова или некоторые сочетания слов, такие как «категория + пол». и «категория + метка» или какие-то дополнительные слова;
  • При сохранении слов рекомендуется учитывать дедупликацию, например, «Sweeter Men» и «Sweater Men» должны быть одинаковыми, а «Nike» и «nike» тоже должны быть одинаковыми;
  • Поскольку источник предлагаемых слов обычно относительно стабилен, цикл выполнения может быть более продолжительным, например, раз в неделю;

SuggestionCounter

  • SuggestionCounter отвечает за получение количества продуктов, связанных с предлагаемыми словами.При необходимости могут быть выполнены некоторые операции агрегации, такие как классификация агрегации и теги;
  • При реализации SuggestionCounter, поскольку интерфейс поиска должен быть фактически вызван, следует максимально избегать влияния на поиск пользователей, например выполнять его рано утром и использовать однопоточный вызов;
  • Чтобы повысить эффективность, многоуровневый интерфейс поиска ELasticsearch должен использоваться для выполнения количества партий, и в то же время, значение подсчета предложенных слов в базе данных должно быть обновлено в партиях;
  • Поскольку SuggestionCounter является относительно ресурсоемким, его можно рассмотреть для увеличения периода выполнения, но это может привести к большой ошибке между значением счетчика и фактическим поиском, что необходимо учитывать в соответствии с реальной ситуацией;

SuggestionIndexRebuiler

  • SuggestionIndexRebuiler отвечает за перестроение индекса;
  • Учитывая поисковые привычки пользователя, можно использоватьMulti-fieldsчтобы добавить несколько анализаторов к предлагаемым словам. Например, для предлагаемого слова [Sweater Jacket] используйте несколько полей, чтобы добавить поле без слов, поле сегментации слова пиньинь, поле сегментации начального слова пиньинь и поле сегментации слова IK, чтобы предлагаемое слово можно было сопоставляется путем ввода [weiyi] и [накладные расходы];
  • Когда индекс перестраивается, он добавляется к временному индексу пакетами посредством массового использования, а затем обновляется через псевдоним;
  • Данные для овраги зависит от предложения Counter, поэтому его цикл выполнения должен соответствовать предложению;

SuggestionService

  • INVENTIONERVICE - это класс услуг, который действительно в предложении поиска пользователей;
  • Обычная реализация заключается в том, чтобы сначала обратиться к кешу, чтобы запросить, можно ли сопоставить кэшированную запись, и, если она может сопоставиться, она будет возвращена напрямую; в противном случае будет вызван Elasticsearch.Prefix QueryДля поиска, так как мы определили Multi-fields при перестроении индекса, мы должны использовать boolQuery для его обработки при поиске; если Elasticsearch возвращает непустые данные результата в это время, добавить их в кеш и вернуть;
POST /suggestion/_search
{
  "from" : 0,
  "size" : 10,
  "query" : {
    "bool" : {
      "must" : {
        "bool" : {
          "should" : [ {
            "prefix" : {
              "keyword" : "卫衣"
            }
          }, {
            "prefix" : {
              "keyword.keyword_ik" : "卫衣"
            }
          }, {
            "prefix" : {
              "keyword.keyword_pinyin" : "卫衣"
            }
          }, {
            "prefix" : {
              "keyword.keyword_first_py" : "卫衣"
            }
          } ]
        }
      },
      "filter" : {
        "range" : {
          "count" : {
            "from" : 5,
            "to" : null,
            "include_lower" : true,
            "include_upper" : true
          }
        }
      }
    }
  },
  "sort" : [ {
    "weight" : {
      "order" : "desc"
    }
  }, {
    "count" : {
      "order" : "desc"
    }
  } ]
}
  • Если Elasticsearch возвращает пустые результаты, в это время следует добавить исправление орфографических ошибок (исправление орфографических ошибок также может быть внесено при вызове поиска Elasticsearch, но обычно у пользователя нет орфографических ошибок, поэтому рекомендуется вызывать его позже отдельно); если возвращенный подсказчик не пуст, предлагаемый словесный сервис будет вызван в соответствии с новым словом; например, если пользователь вводит [adidss], а результат, полученный при вызове подсказчика Elasticsearch, будет [adidas], то предложенный слово будет найдено в соответствии с adidas.
POST /suggestion/_search
{
  "size" : 0,
  "suggest" : {
    "keyword_suggestion" : {
      "text" : "adidss",
      "term" : {
        "field" : "keyword",
        "size" : 1
      }
    }
  }
}
  • О сортировке: в нашей реализации мы сортируем по весу и количеству, а вес в настоящее время учитывает только тип предлагаемых слов (например, «Категория» > «Бренд» > «Ярлык»);

Достижение результатов и последующие улучшения

  • С помощью приведенной выше реализации мы смогли реализовать относительно мощное слово подсказки для поиска Фактический эффект выглядит следующим образом:

最终效果

  • Последующие улучшения, которые можно рассмотреть: обратитесь к Amazon, чтобы увеличить агрегированное отображение категорий, повысить персонализированную обработку пользователей для поддержки лучшей сортировки предлагаемых слов и поддержки более эффективных рекомендуемых слов на основе истории поиска пользователя;

использованная литература