Поиск по нескольким индексам вastica - PullRequest
0 голосов
/ 10 октября 2018

Я ищу способ поиска по нескольким индексам одновременно, используя Elastica.

У меня есть индекс products, а индекс user.

products содержит {product_id, product_name, price}, а user содержит {product_id, user_name, date}.Зная, что product_id в обоих одинаковы, в products каждый products_id уникален, но в user они не таковы, как пользователь может купить один и тот же продукт несколько раз.

В любом случае, я хочу автоматически получать цену товара из индекса products при поиске по индексу user.

Я знаю, что мы можем искать по нескольким индексам, например, так (поправьте меня, если я ошибаюсь):

$search = new \Elastica\Search($client);
$search->addIndex('users')
        ->addType('user')
        ->addIndex('products')
        ->addType('product');

Но проблема в том, что когда я пишу агрегацию на products_id например, а затем создайте новый запрос с некоторыми фильтрами:

$products_agg = new \Elastica\Aggregation\Terms('products_id');
$products_agg->setField('products_id')->setSize(0);

$query = new \Elastica\Query();
$query->addAggregation($products_agg);
$query->setQuery($bool);

$search->setQuery($query);

Как эластика узнает, по какому индексу искать?Как я могу связать это products_id с другим индексом?

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

Библиотека Elastica имеет поддержку Multi Search API. multi search API позволяет выполнять несколько поисковых запросов в рамках одного API.Конечной точкой для него является _msearch.

. Формат запросов аналогичен массовому API. Первая строка - это часть заголовка, в которой указываются индексы / индексы для поиска, вторая строка - типичный поиск.запросы тела.

{"index" : "products", "type": "products"}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10} // write your own query to get price
{"index" : "uesrs", "type" : "user"}
{"query" : {"match_all" : {}}} // query for user

Проверьте контрольный пример в Multi / SearchTest.php , чтобы узнать, как его использовать.

0 голосов
/ 16 октября 2018

вы можете попробовать следующее: 1- присваивать имена индексам с определенным именем, например следующим:

myFirstIndex-myProjectName
mySecIndex-myProjectName
myThirdIndex-myProjectName

и т. Д.

2 - это дает мне возможность использовать * в полеиндексов для поиска, потому что он принимает подстановочный знак, так что я могу искать по нескольким полям, как это, используя kibana Dev Tools

GET *-myProjectName/_search
{
  "_source": {
    "excludes": [ "*" ]
  },
  "query": { "match_all": {} },
}

, это будет искать по каждому индексу, включая -myProjectName.

0 голосов
/ 18 октября 2018

Вы не можете запросить два индекса с разными отображениями.Лучший способ решить вашу проблему - просто выполнить два запроса (соединения на стороне приложения).В первом запросе вы выполняете агрегации для пользователя, а во втором вы получаете цены.

Другой вариант - добавить цену в индекс пользователя.Иногда вам нужно пожертвовать небольшим пространством для лучшего удобства использования.

0 голосов
/ 10 октября 2018

Обычно вы хотите объединить два индекса на основе общего поля, как в sql.

Что вы можете сделать, это смоделировать ваши данные в одном индексе, используя тип данных соединения

https://www.elastic.co/guide/en/elasticsearch/reference/master/parent-join.html

Индексировать все документы в одном индексе,

  • Сделать все документы продукта - родительскими.
  • Сделать все документы пользователя дочерними

И использовать родительские и дочерние агрегаты и запросы

https://www.elastic.co/guide/en/elasticsearch/reference/master/parent-join.html#_parent_join_queries_and_aggregations

ПРИМЕЧАНИЕ: - убедитесь, что производительность влияет на родительский-child mapping https://www.elastic.co/guide/en/elasticsearch/reference/master/parent-join.html#_parent_join_and_performance

Еще одна вещь, которую вы можете сделать, это разместить всю информацию о продукте у каждого пользователя, который его покупает.

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

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

...