Elasticsearch支持并查询多个值



lasticsearch 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和to< = 30。因此,它将返回所有包含ID = 2的记录,并且范围在20到30之间。因此,即使在其他记录中,如果不存在ID = 1,它也会搜索范围值,如果范围匹配,则会返回记录。

我想搜索具有ID = 1的记录,并且ID的值应在20到30之间。所以我的问题是,弹性搜索是否支持这种介于之间和查询?

之间

您需要 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数据类型而不是range.from/to对象。只是我的两分钱

最新更新