根据过滤器

时间:2017-10-27 09:35:28

标签: elasticsearch elasticsearch-5

我在ElasticSearch中有以下结构的文档:

"_source": {
          "last_updated": "2017-10-25T18:33:51.434706",
          "country": "Italia",
          "price": [
            "€ 139",
            "€ 125",
            "€ 120",
            "€ 108"
          ],
          "max_occupancy": [
            2,
            2,
            1,
            1
          ],
          "type": [
            "Type 1",
            "Type 1 - (Tag)",
            "Type 2",
            "Type 2 (Tag)",
          ],
          "availability": [
            10,
            10,
            10,
            10
          ],
          "size": [
            "26 m²",
            "35 m²",
            "47 m²",
            "31 m²"
          ]
        }
      }

基本上,细节记录分为5个数组,同一记录的字段在5个数组中具有相同的索引位置。从示例数据中可以看出,有5个数组(price,max_occupancy,type,availability,size)包含与同一元素相关的值。我想提取max_occupancy字段大于或等于2的元素(如果没有记录,如果没有3抓住3,如果没有3抓住4,......),价格较低,在这种情况下记录并将结果放入一个新的JSON对象,如下所示:

{
          "last_updated": "2017-10-25T18:33:51.434706",
          "country": "Italia",
          "price: ": "€ 125",
          "max_occupancy": "2",
          "type": "Type 1 - (Tag)",
          "availability": 10,
          "size": "35 m²"
}  

基本上结果结构应该显示提取的记录(在这种情况下是所有数组的第二个索引),并向其添加一般信息(字段:" last_updated"," country& #34;。)

是否可以从弹性搜索中提取这样的结果?我需要执行什么样的查询?

有人可以建议最好的方法吗?

1 个答案:

答案 0 :(得分:1)

我最好的方法:Nested Datatype

嵌套

除了更容易查询之外,更容易阅读和理解当前散布在不同数组中的那些对象之间的连接。

是的,如果您决定使用此方法,则必须修改mapping并重新索引整个数据。

映射将如何呈现?像这样的东西:

{
  "mappings": {
    "properties": {
      "last_updated": {
        "type": "date"
      },
      "country": {
        "type": "string"
      },
      "records": {
        "type": "nested",
        "properties": {
          "price": {
            "type": "string"
          },
          "max_occupancy": {
            "type": "long"
          },
          "type": {
            "type": "string"
          },
          "availability": {
            "type": "long"
          },
          "size": {
            "type": "string"
          }
        }
      }
    }
  }
}

编辑:新文档结构(包含嵌套文档) -

{
  "last_updated": "2017-10-25T18:33:51.434706",
  "country": "Italia",
  "records": [
    {
      "price": "€ 139",
      "max_occupancy": 2,
      "type": "Type 1",
      "availability": 10,
      "size": "26 m²"
    },
    {
      "price": "€ 125",
      "max_occupancy": 2,
      "type": "Type 1 - (Tag)",
      "availability": 10,
      "size": "35 m²"
    },
    {
      "price": "€ 120",
      "max_occupancy": 1,
      "type": "Type 2",
      "availability": 10,
      "size": "47 m²"
    },
    {
      "price": "€ 108",
      "max_occupancy": 1,
      "type": "Type 2 (Tag)",
      "availability": 10,
      "size": "31 m²"
    }
  ]
}

现在,使用Nested QueryInner Hits查询任何特定条件都更容易。例如:

{
  "_source": [
    "last_updated",
    "country"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "country": "Italia"
          }
        },
        {
          "nested": {
            "path": "records",
            "query": {
              "bool": {
                "must": [
                  {
                    "range": {
                      "records.max_occupancy": {
                        "gte": 2
                      }
                    }
                  }
                ]
              }
            },
            "inner_hits": {
              "sort": {
                "records.price": "asc"
              },
              "size": 1
            }
          }
        }
      ]
    }
  }
}

条件为:Italiamax_occupancy > 2

内部命中:按价格升序排序并获得第一个结果

希望你会发现它很有用