在Elasticsearch中查询嵌套对象

时间:2014-11-16 13:24:57

标签: python elasticsearch pyelasticsearch

我有一个Product-Merchant映射,如下所示

  catalog_map = {

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

“product”包含对象,例如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”的索引中所有商品的结果。但是,我希望它能够返回由“约翰爵士”出售的“香草”产品的细节。

根据某人的建议,我在查询时使用了“_source”,但这没有用。

如何从商家的整个“目录”索引中挑出单个对象的信息?

1 个答案:

答案 0 :(得分:2)

bool查询必须子句后,其中的所有条件都是必需的。 子句中的条件不是必需的。他们只会提高结果。 (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"
            }
          }
        }
      ]
    }
  }
}