Как использовать ElasticSearch для поиска (фильтрации) товаров в интернет-магазине? - PullRequest
0 голосов
/ 01 августа 2020

Я новичок в ElasticSearch! У меня есть интернет-магазин (с использованием Laravel) с более чем 1000000 продуктов, и каждый продукт имеет некоторые свойства в таблице product, такие как имя, описание, цена, ... и некоторые другие свойства в других таблицах, например categories, options, tags, addresses, rating, brands, ... которые находятся в отдельных таблицах, и они будут присоединяться к продуктам с помощью отношений many-to-many!

, поэтому я хочу иметь очень быстрый и надежный поиск товаров с множеством фильтров! как амзон! например, пользователь сможет найти продукты со специальными категориями, тегами, опциями, ...! как вы сейчас в mysql, мне нужно несколько раз использовать что-то вроде WHERE EXISTS, INNER JOIN и ... и, поскольку количество продуктов слишком велико, эти запросы настолько дороги и медленны! Итак, я обнаружил, что у elasti c search есть решение для этой ситуации! он любит работать с большими данными!

Я читал об этом! теперь у меня есть идея, но я не уверен, что это правильный способ?

Я говорю, что мы можем хранить каждый categories, options, tags, addresses, rating, brands как объект json в elasti c искать только по каждому событию UPDATE / STORE в приложении laravel! в mysql у них есть отдельные таблицы и их отношения «многие ко многим»! но нам не нужно определять индекс для каждой из них (таблиц) и повторять, чтобы объединить их в эласти c снова так же, как mysql способ!

в эласти c поиск у нас будет этот шаблон для продуктов:

"id" : 782,
"title" : "dmorar",
"price" : "11000.00",
"options" : [ the ids of the product's tags ],
"categories" : [ the ids of the product's categories],
"tags" : [ the ids of the product's tags ],
"addresses" : [ the ids of the product's addresses]

это пример:

  {
    "_index" : "so_product",
    "_type" : "_doc",
    "_id" : "1099",
    "_score" : 1.0,
    "_source" : {
      "id" : 782,
      "title" : "dmorar",
      "price" : "11000.00",
      "created_at" : "2020-07-30T14:01:09.000000Z",
      "updated_at" : "2020-07-30T14:01:09.000000Z",
      "options" : [
        75,
        955,
        480,
        351,
        285
      ],
      "categories" : [
        944,
        421
      ],
      "tags" : [
        210,
        198,
        648,
        976,
        10,
        553,
        624,
        967,
        726,
        121,
        797
      ],
      "addresses" : [
        119,
        43,
        140,
        1713,
        855,
        1515,
        958
      ]
    }
  },
  {
    "_index" : "so_product",
    "_type" : "_doc",
    "_id" : "1344",
    "_score" : 1.0,
    "_source" : {
      "id" : 429,
      "title" : "ethyl.wehner",
      "price" : "89000.00",
      "created_at" : "2020-07-30T13:59:02.000000Z",
      "updated_at" : "2020-07-30T13:59:02.000000Z",
      "options" : [
        121,
        195,
        348
      ],
      "categories" : [
        372,
        315,
        869,
        544,
        645,
        803,
        564
      ],
      "tags" : [
        347,
        797
      ],
      "addresses" : [
        609,
        1477,
        187,
        1479
      ]
    }
  },
  {
    "_index" : "so_product",
    "_type" : "_doc",
    "_id" : "1370",
    "_score" : 1.0,
    "_source" : {
      "id" : 358,
      "title" : "cicero.casper",
      "price" : "67000.00",
      "created_at" : "2020-07-30T13:58:37.000000Z",
      "updated_at" : "2020-07-30T13:58:37.000000Z",
      "options" : [
        665,
        28,
        488,
        384,
        547,
        877
      ],
      "categories" : [
        508,
        201
      ],
      "tags" : [
        325,
        472,
        595,
        797,
        943,
        948,
        803,
        136,
        288,
        275,
        574,
        390
      ],
      "addresses" : [
        691,
        1637,
        534,
        770,
        499,
        1086,
        430,
        1365,
        1325
      ]
    }
  }

Купите таким образом, подобный поисковый запрос может дать пользователю полный контроль над использованием каждого фильтра, который он хочет и это быстро:

GET so_product/_search
{
  "query": {
      "bool": {
      "must": [
        {
            "term": {
            "options": 5
            }
        }, 
        {
            "term": {
            "options": 695
            }
        } ,
        {
            "term": {
            "categories": 523
            }
        }
         ,
        {
            "term": {
            "addresses": 116
            }
        } 
        ,
        {
            "term": {
            "tags": 797
            }
        } 
      ]
    }
  }
}

Но, как я уже сказал, я не уверен, что это правильный путь или нет? если не правильно, то какой стандартный способ? как Amazon реализует эти поисковые фильтры?

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Мое наблюдение:

Elasti c Поиск - отличный инструмент для:

  1. Поиск

  2. Агрегирование в реальном времени

На заметку:

  1. Используйте его, если возможна согласованность в конечном итоге. Например, проиндексированные документы могут быть не сразу доступны для поиска.
  2. Хранить данные, необходимые для поиска, в денормализованном формате.
  3. ES имеет некоторые нюансы, например, количество первичных сегментов не может быть увеличено, убедитесь, что чтобы иметь значение, которое работает для вас.

Ваш вариант использования:

  1. Mysql плохо обслуживает ваше приложение для поиска (с данные, которые у вас есть).
    • ES - хороший вариант для поиска
  2. Ваша схема выглядит хорошо. Не забудьте явно указать сопоставление индекса.
1 голос
/ 02 августа 2020

Ваша схема ES в порядке, но вы можете улучшить ее, заменив идентификаторы (например, идентификаторы тегов, идентификаторы категорий и т.д. c) их фактическими значениями. Таким образом, вы можете получить фильтры и фасеты боковой панели из ElasticSearch на основе введенного запроса, плюс вы можете получить их намного быстрее, чем получать их из MySQL.

Поскольку вы используете Laravel, вы можете использовать события, когда продукт создается, обновляется или какие-либо свойства, такие как категории, теги и ... добавляются к продуктам, чтобы отразить изменения в elasti c search.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...