0

我正在为一些列表数据构建搜索查询。作为搜索的一部分,人们可以要求多个能睡最少人数的房间,即两个能睡 2 人和 3 人的房间。

我不确定如何使用过滤器执行此操作。

到目前为止,这是一个缩短的搜索查询。

    {
  "query":{
    "filtered":{
      "query":{
        "match_all":{}
      }
    }
  },
  "filter":{
    "and":
      [
        {
          "term":{
          "status":"live"
          }
        },
        {
          "geo_bounding_box":{
            "location":{
              "top_left":"60.856553, -8.64935719999994",
              "bottom_right":"49.8669688, 1.76270959999999"
              }
            }
          }
        ,{
        "range":{
          "bedrooms":{
            "gte":"2"
            }
          }
        }
      ]
    }
  ,
  "size":10
}

测试数据

{
       "took":1,
       "timed_out":false,
       "_shards":{
          "total":5,
          "successful":5,
          "failed":0
       },
       "hits":{
          "total":3,
          "max_score":1.0,
          "hits":[
             {
                "_index":"listings",
                "_type":"listing",
                "_id":"1",
                "_score":1.0,
                "_source":{
                   "name:":"Listing One",
                   "address1":"Some Street",
                   "bedrooms":2,
                   "city":"A City",
                   "id":1,
                   "refno":"FI451",
                   "user_id":1,
                   "rooms":[
                      {
                         "bathroom":"Shared bathroom with bath",
                         "double_standard":null,
                         "id":5,
                         "single":2,
                         "sleeps":2,
                         "title":"Twinny",
                      },
                      {
                         "bathroom":"Ensuite with bath",
                         "double_king_size":1,
                         "double_standard":1,
                         "id":1,
                         "single":null,
                         "sleeps":2,
                         "title":"Double Ensuite Room",
                      }
                   ]
                }
             },
             {
                "_index":"listings",
                "_type":"listing",
                "_id":"2",
                "_score":1.0,
                "_source":{
                   "name":"Listing Two",
                   "address1":"Some Street",
                   "bedrooms":2,
                   "city":"A City",
                   "id":2,
                   "refno":"BL932",
                   "user_id":1,
                   "rooms":[
                      {
                         "bathroom":"Ensuite with bath",
                         "double_standard":1,
                         "id":4,
                         "single":1,
                         "sleeps":3,
                         "title":"Family Room",
                      },
                      {
                         "bathroom":"Ensuite with shower",
                         "double_standard":1,
                         "id":2,
                         "single":null,
                         "sleeps":2,
                         "title":"Single Room",
                      }
                   ]
                }
             },
             {
                "_index":"listings",
                "_type":"listing",
                "_id":"3",
                "_score":1.0,
                "_source":{
                   "name":"Listing Three",
                   "address1":"Another Address",
                   "bedrooms":1,
                   "city":"Your City",
                   "id":3,
                   "refno":"TE2116",
                   "user_id":1,
                   "rooms":[
                      {
                         "bathroom":"Ensuite with shower",
                         "double_king_size":null,
                         "double_standard":1,
                         "id":3,
                         "single":1,
                         "sleeps":3,
                         "title":"Family Room",
                      }
                   ]
                }
             }
          ]
       }
    }

如果您查看我的数据,我有 3 个房源,其中两个有多个房间(房源一和二),但只有房源二会匹配我的搜索,原因是它有一个房间睡两个,另一个睡三个。

是否可以使用 elasticsearch 执行此查询?

4

2 回答 2

1

如果您想要的是“查找一间卧室睡 2 人且另一间卧室睡 3 人的所有房源”,则此查询将起作用。它做了一个很大的假设:您使用的是内部对象,而不是嵌套数据类型。

此查询使用内部对象折叠到单个字段中的事实,导致“rooms.sleeps”等于所需字段的 [2,3]。由于该字段被折叠成一个数组,一个简单的Terms查询将匹配它们。当您将执行模式更改为 And 时,它会强制匹配 2 和 3。

需要注意的是,具有 [2,3,4] 的房间也将被匹配。

我省略了地理和状态部分,因为源文档中没有提供该数据。

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      }
    }
  },
  "filter": {
    "and": [
      {
        "range": {
          "bedrooms": {
            "gte": "2"
          }
        }
      },
      {
        "terms": {
          "rooms.sleeps": [2,3],
          "execution": "and"
        }
      }
    ]
  },
  "size": 10
}

于 2013-03-23T00:08:36.170 回答
0

据我所知,filter必须是元素query内部的兄弟。filtered请参阅: http ://www.elasticsearch.org/guide/reference/query-dsl/filtered-query/

如果你将它与 Zach 的解决方案结合起来,它应该可以工作。

{
    "query":
    {
        "filtered":
        {
            "query":
            {
                "match_all":{}
            },
            "filter":
            {
                "put" : "your filter here"
            }
        }
    }
}
于 2013-03-27T02:08:29.060 回答