Elasticsearch是否支持多个值的AND查询?

时间:2018-04-27 05:10:52

标签: elasticsearch kibana

ElasticSearch v:5.3

我在弹性搜索中有一个项目数组存储。

userId: "123"
items: [
  {
    "range": {
      "from": 10,
      "to": 30
    },
    "id": "1"
  },
  {
    "range": {
      "from": 20,
      "to": 100
    },
    "id": "2"
  },
  {
    "range": {
      "from": 5,
      "to": 90
    },
    "id": "3"
  },
]

这只是单曲。将此视为包含项密钥的多个记录。 现在我想用id及其受尊重的范围执行搜索查询。所以我当前的查询就像这样

GET product/item/_search{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "items.id": "1"
          }
        },
        {
          "range": {
            "items.range.from": {
              "gte": 20,
              "lte": 30
            }
          }
        },
        {
          "range": {
            "items.range.to": {
              "gte": 20,
              "lte": 30
            }
          }
        },

      ]
    }
  }
}

目前,这将执行搜索查询,其id = 1且范围值从> = 20到< = 30.因此它将返回包含id = 2且范围介于20到30之间的所有记录因此,即使在其他记录中,如果id = 1不存在,它将搜索范围值,如果范围匹配,将返回记录。

而不是这个我想搜索id = 1且id值在20到30之间的记录。 所以我的问题是弹性搜索在AND查询之间是否支持这种?

1 个答案:

答案 0 :(得分:1)

您的映射中需要items字段为nested,如下所示:

PUT product
{
  "mappings": {
    "item": {
      "properties": {
        "itemId": {
          "type": "long"
        },
        "items": {
          "type": "nested",
          "properties": {
            "id": {
              "type": "long"
            },
            "range": {
              "properties": {
                "from": {
                  "type": "long"
                },
                "to": {
                  "type": "long"
                }
              }
            }
          }
        }
      }
    }
  }
}

然后你就可以这样查询:

GET product/item/_search
{
  "query": {
    "nested": {
      "path": "items",
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "items.id": "1"
              }
            },
            {
              "range": {
                "items.range.from": {
                  "gte": 20,
                  "lte": 30
                }
              }
            },
            {
              "range": {
                "items.range.to": {
                  "gte": 20,
                  "lte": 30
                }
              }
            }
          ]
        }
      }
    }
  }
}

PS:我建议您查看integer_range data type而不是range.from/to对象。只是我的两美分