Iy может быть легко достигнуто с помощью Elasticsearch, и вы должны определить shop_id
в качестве поля ключевого слова, а затем использовать его в контексте фильтра запроса, чтобы убедиться, что вы ищете только товары, принадлежащие конкретному shop_id
.
Использование shop_id
в контексте фильтра также значительно повышает производительность поиска, так как они по умолчанию кэшируются в Elasticsearch, как описано в официальном do c
В контексте фильтра предложение запроса отвечает на вопрос «Соответствует ли этот документ этому предложению запроса?» Ответ прост: да или нет - баллы не рассчитываются. Контекст фильтра в основном используется для фильтрации структурированных данных, например,
Установлено ли в поле состояния значение «опубликовано»?
Elasticsearch автоматически кэширует часто используемые фильтры для повышения производительности.
Пример сопоставления и запроса в соответствии с вашими требованиями:
Индексное отображение
{
"mappings" :{
"properties" : {
"product" : {
"type" : "text"
},
"shop_id" :{
"type" : "keyword"
}
}
}
}
Индексные образцы документов для двух идентификаторов магазина различий
{
"product" : "foo",
"shop_id" : "stackoverflow"
}
{
"product" : "foo",
"shop_id" : "opster"
}
Поиск foo
товара, где shop_id равен stackoverflow
{
"query": {
"bool": {
"must": [
{
"match": {
"product": "foo"
}
}
],
"filter": [
{
"term": {
"shop_id": "stackoverflow"
}
}
]
}
}
}
Результат поиска
"hits": [
{
"_index": "productshop",
"_type": "_doc",
"_id": "2",
"_score": 0.18232156,
"_source": {. --> note only foo belong to `stackoverflow` returned
"product": "foo",
"shop_id": "stackoverflow"
}
}
]