代码之家  ›  专栏  ›  技术社区  ›  parth

Elasticsearch是否支持并查询多个值?

  •  0
  • parth  · 技术社区  · 7 年前

    ElasticSearch v:5.3

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

    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之间的记录。 所以我的问题是,弹性搜索是否支持这种介于和之间的查询?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Val    7 年前

    你需要你的 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
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    附言:我建议你看看 integer_range data type 而不是你的 range.from/to 对象就我的两分钱