首页 文章

弹性搜索查询两个字段值之间存在值

提问于
浏览
2

我试图弄清楚如何构建针对弹性搜索的查询,其中查询值存在于2个字段值的范围之间 .

让我们说我有一个模板

{
     "template": "addresses",
     "mappings": { 
         "addresses": {
             "properties": {
                   "street_number_1": { "type": "integer" },
                   "street_number_2": { "type": "integer" },
                    ... //other unimportant fields
              }
          }
 }

根据上面的定义,如果我的地址为100-120 High Street,其中street_number_1为100而street_number_2为120,如果我要执行112 High Street的搜索,则该记录应返回100和100之间 . 120.什么样的弹性搜索功能/查询可以让我这样做?

1 回答

  • 1

    你有两个选择 . 使用当前映射,您可以使用两个range queries,如下所示:

    {
      "query": {
        "bool": {
          "filter": [
            {
              "range": {
                "street_number_1": {
                  "lte": 112
                }
              }
            },
             {
              "range": {
                "street_number_2": {
                  "gte": 112
                }
              }
            }
          ]
        }
      }
    }
    

    第二个选项涉及更改映射以使用integer range作为街道号码 . 像这样定义您的街道号码映射:

    PUT addresses
    {
      "mappings": {
        "_doc": {
          "properties": {
            "street_number": {
              "type": "integer_range"
            }
          }
        }
      }
    }
    

    然后索引您的地址文档,如下所示:

    PUT addresses/_doc/1
    {
      "street_number" : { 
        "gte" : 100,
        "lte" : 120
      }
    }
    

    最后像这样查询:

    POST addresses/_search
    {
      "query" : {
        "term" : {
          "street_number" : {
            "value": 112
          }
        }
      }
    }
    

相关问题