3

顧客の出身地に基づいてElasticSearchを使用して取得したい顧客ドキュメントがいくつかあります(国フィールドは一連の国にあります)。

[
  {
    "name": "A1",
    "address": {
      "street": "1 Downing Street"
      "country": {
        "code": "GB",
        "name": "United Kingdom"
      }
    }
  },
  {
    "name": "A2",
    "address": {
      "street": "25 Gormut Street"
      "country": {
        "code": "FR",
        "name": "France"
      }
    }
  },
  {
    "name": "A3",
    "address": {
      "street": "Bonjour Street"
      "country": {
        "code": "FR",
        "name": "France"
      }
    }
  }
]

これで、Pythonコードに別の配列があります。

["DE", "FR", "IT"]

A2とA3の2つのドキュメントを入手したいのですが。

これをPyES/Query DSLでどのように記述しますか?これにはExistsFilterまたはTermQueryを使用することになっていますか。ExistsFilterは、フィールドが存在するかどうかをチェックするだけのようですが、値は気にしません。

4

1 に答える 1

3

NoSQLタイプのドキュメントストアでは、返されるのはドキュメントの一部ではなく、ドキュメントだけです。

要件:「A2とA3の2つのドキュメントを取得したい。」は、別の「親」ドキュメント内の配列としてではなく、これらのドキュメントのそれぞれに個別にインデックスを付ける必要があることを意味します。

親ドキュメントの値を一緒に一致させる必要がある場合はcountry、データを非正規化し、親ドキュメントの値を各サブドキュメント内に保存する必要があります。

上記を実行すると、クエリは簡単になります。countryフィールドは次のようにマップされていると想定しています。

国:{タイプ: "文字列"、インデックス:"not_analyzed"}

を使用してドキュメントを検索するには、次の操作DEを実行できます。

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "term" : {
               "country" : "DE"
            }
         }
      }
   }
}
'

DEまたはのいずれかでドキュメントを検索するにはFR

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "terms" : {
               "country" : [
                  "DE",
                  "FR"
               ]
            }
         }
      }
   }
}
'

上記を他のクエリ用語と組み合わせるには:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "terms" : {
               "country" : [
                  "DE",
                  "FR"
               ]
            }
         },
         "query" : {
            "text" : {
               "address.street" : "bonjour"
            }
         }
      }
   }
}
'

また、オブジェクトの配列がフラット化される方法のために、オブジェクトの配列がどのようにトリッキーになる可能性があるかについては、この回答を参照してください。

ElasticSearchでネストされたドキュメントを並べ替えることは可能ですか?

于 2012-08-17T08:46:09.583 に答える