0

次のような製品と販売者のマッピングがあります

  catalog_map = {

        "catalog": {
            "properties": {
                "merchant_id": {
                    "type": "string",
                },
                "products": {
                    "type": "object",
                },
                "merchant_name" :{
                    "type" : "string"
                }
            }
        }
    }

「製品」には、product_id、product_name、product_price などのオブジェクトがあります。製品と販売者は、次のようにマッピングされます。

    for merchant in Merchant.objects.all() :

        products = [{"product_name" : x.product.name, "product_price" : x.price, "product_id" : x.product.id , "product_category" : x.product.category.name} for x in MerchantProductMapping.objects.filter(merchant=merchant)]

        tab = {
            'merchant_id': merchant.id,
            'merchant_name': merchant.name,
            'product': products
            }

       res = es.index(index="my-index", doc_type='catalog', body=tab)

データは、目的の形式でスムーズにインデックス付けされます。ここで、特定のインデックスからデータをクエリするときは、次の方法で行います。

GET /esearch-index/catalog/_search
{ 
"query": {
"bool" :{
    "must": [
       {"match": {
          "merchant_name": {
              "query": "Sir John"
          }
       }}], 
       "should": [
          {"match": {
             "product_name": {
                 "query": "Vanilla"
             }
          }}
       ]
    }}

このクエリは、マーチャント名が "Sir John" のインデックス内のすべての製品の結果を返します。ただし、代わりに「Sir John」が販売する商品「Vanilla」の詳細を返してほしい。

誰かの推薦で、クエリ中に「_source」を使用しましたが、それは役に立ちません。

マーチャントの「カタログ」インデックス全体から 1 つのオブジェクトの情報を抽出するにはどうすればよいですか?

4

1 に答える 1

2

bool クエリmust句があると、その中のすべての条件が必須になります。should句内の条件は必須ではありません。彼らは結果を後押しするだけです。( http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html#query-dsl-bool-query )

したがって、クエリに戻ると、merchant_name "Sir John" に一致するすべてのカタログが取得されます。これが唯一の必須 (必須) 条件です。"Vanilla" という名前は、必須ではないため、"Vanilla" という名前の結果のみを上位に押し上げます。

"Sir John" が販売する "Vanilla" を取得する場合は、両方の条件を must 句に入れ、クエリを次のように変更します。

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "merchant_name": {
              "query": "Sir John"
            }
          }
        },
        {
          "match": {
            "product_name": {
              "query": "Vanilla"
            }
          }
        }
      ]
    }
  }
}
于 2014-11-17T11:18:44.847 に答える