0

いくつかのリスト データの検索クエリを作成しています。検索の一環として、最小人数が宿泊できる複数の部屋、つまり 2 人と 3 人が宿泊できる 2 つの部屋を求めることができます。

フィルターでそれを実行する方法がわかりません。

これまでの短縮検索クエリを次に示します。

    {
  "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 つのリスティングがあり、そのうちの 2 つには複数の部屋 (リスティング 1 と 2) がありますが、検索に一致するのはリスティング 2 だけです。

このクエリをelasticsearchで実行することは可能ですか?

4

2 に答える 2

1

ベッドルームが 2 人部屋で、別のベッドルームが 3 人部屋のリスティングをすべて検索する」場合、このクエリは機能します。ここでは、Nested データ型ではなく、内部オブジェクトを使用しているという 1 つの大きな前提があります。

このクエリは、内部オブジェクトが 1 つのフィールドに折りたたまれているという事実を利用しているため、目的のフィールドの "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兄弟でなければなりません。参照: http://www.elasticsearch.org/guide/reference/query-dsl/filtered-query/queryfiltered

それをザックのソリューションと組み合わせると、うまくいくはずです。

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