Elasticsearch根据2个条件返回文档,其中一个基于其他条件

时间:2019-05-02 07:42:58

标签: elasticsearch

我的文件格式如下:

{
   "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的文档。请注意,这意味着我们返回了厨师ID为1和3的文档。
  • 然后,对于尚未获得具有相同厨师ID的另一个文档的文档,返回isSpecial标志设置为true的位置。因此,将仅返回文件3。因为我们已经有一个厨师id等于1的文档,所以不会返回2。

在Elasticsearch中可以进行这种链接吗?我希望能够在单个查询中执行此操作,以便避免在我的(Java)代码中添加逻辑。

1 个答案:

答案 0 :(得分:0)

在一个Elasticsearch查询中无法拥有这种逻辑。您可能需要使用aggregates / post_filter进行棘手的查询,因此在一个查询中拥有所需的所有数据,然后在Java应用程序中对其进行转换。 但是最好的方法(也是更可维护的)是有两个查询。