Elasticsearch для возврата документов на основе 2 критериев, где один основан на другом - PullRequest
0 голосов
/ 02 мая 2019

У меня есть документы в следующем формате:

{
   "id": number
   "chefId: number
   "name": String,
   "ingredients": List<String>,
   "isSpecial": boolean
}

Вот список из 5 документов:

{
   "id": 1,
   "chefId": 1,
   "name": "Roasted Potatoes",
   "ingredients": ["Potato", "Onion", "Oil", "Salt"],
   "isSpecial": false
},
{
   "id": 2,
   "chefId": 1,
   "name": "Dauphinoise potatoes",
   "ingredients": ["Potato", "Garlic", "Cream", "Salt"],
   "isSpecial": true
},
{
   "id": 3,
   "chefId": 2,
   "name": "Boiled Potatoes",
   "ingredients": ["Potato", "Salt"],
   "isSpecial": true
},
{
   "id": 4,
   "chefId": 3
   "name": "Mashed Potatoes",
   "ingredients": ["Potato", "Butter", "Milk"],
   "isSpecial": false
},
{
   "id": 5,
   "chefId": 4
   "name": "Hash Browns",
   "ingredients": ["Potato", "Onion", "Egg"],
   "isSpecial": false
}

Я буду выполнять поиск, где "Картофель" содержится вполе имени.Например:

{
  "query": {
    "wildcard": {
      "status": {
        "value": "*Potatoes*"
      }
    }
  }
}

Но я также хочу добавить некоторые дополнительные критерии при возврате документов:

  • Если ингредиенты содержат лук или молоко, верните документы.Таким образом, документы с id 1 и 4 будут возвращены.Обратите внимание, что это означает, что у нас есть документы, возвращенные с идентификаторами шеф-поваров 1 и 3.
  • Затем, для документов, где у нас еще нет другого документа с таким же идентификатором шеф-повара, возвращаем, где установлен флаг isSpecialк истине.Таким образом, только документ 3 будет возвращен.2 не будет возвращено, поскольку у нас уже есть документ, в котором идентификатор шеф-повара равен единице.

Можно ли создать такой тип цепочки в Elasticsearch?Я хотел бы иметь возможность сделать это в одном запросе, чтобы избежать добавления логики в мой (Java) код.

1 Ответ

0 голосов
/ 02 мая 2019

Вы не можете иметь такую ​​логику в одном запросе эластичного поиска.У вас может быть сложный запрос с aggregations / post_filter и так, чтобы все необходимые данные были в одном запросе, а затем преобразовать их в ваше Java-приложение.Но лучший подход (и более обслуживаемый) - это два запроса.

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