在数组中搜索哈希

时间:2014-10-08 10:03:29

标签: elasticsearch

我在ES中有这样的对象:

{
  _index: products_development_20141007185853021
  _type: product
  _id: 5039
  _version: 1
  _score: 1
  _source: {
    name: Le Moelleux - Gâ teau tout Chocolat
    quantity: 500
    quantity_unit: gram
    store_ids: [
      503
      504
      505
    ]
    name_suggest: Le Moelleux - Gâ teau tout Chocolat
    store_prices: [{
      id: 503
      price: 2.65
    } {
      id: 504
      price: 2.65
    } {
      id: 505
      price: 2.65
    } ]
    product_categories: [{
      id: 109
      name: Viennoiserie
      parent: {
        id: 105
        name: Pain,
        viennoiserie,
        biscotte
        parent_id: 92
        tags: [
          pains et viennoiseries
          biscotte
          tartine
          biscottes tartines
          boulangerie
          pâ tisseries moelleuses
        ]
      }
    }]
    product_brand: {
      id: 1134
      name: KER CADELAC
      type: null
    }
    store_company: {
      id: 4
      name: Chronodrive
    }
    categories_and_ancestors: [{
      id: 109
    } {
      id: 105
    } {
      id: 92
    }]
  }
}

使用此映射:

mappings: {
  product: {
    properties: {
      item_count: {
        type: integer
      }
      name_suggest: {
        search_analyzer: whitespace_analyzer
        index_analyzer: nGram_analyzer
        type: string
      }
      store_company: {
        properties: {
          name: {
            type: string
          }
          id: {
            type: long
          }
        }
      }
      quantity_unit: {
        index: not_analyzed
        type: string
      }
      quantity: {
        type: double
      }
      store_ids: {
        type: string
      }
      store_prices: {
        properties: {
          price: {
            type: double
          }
          id: {
            type: integer
          }
        }
      }
      categories_and_ancestors: {
        properties: {
          id: {
            type: integer
          }
        }
      }
      product_categories: {
        properties: {
          parent: {
            properties: {
              parent_id: {
                type: long
              }
              name: {
                type: string
              }
              id: {
                type: long
              }
              tags: {
                type: string
              }
            }
          }
          name: {
            type: string
          }
          id: {
            type: integer
          }
        }
      }
      name: {
        analyzer: product_analyzer
        type: string
      }
      product_brand: {
        properties: {
          name: {
            type: string
            fields: {
              raw: {
                index: not_analyzed
                type: string
              }
            }
          }
          id: {
            type: integer
          }
          type: {
            type: string
          }
        }
      }
    }
  }
}

如何发出请求或过滤器以获取store_prices未包含的所有文档:

{
  id: 503
  price: 0
}

我的意思是完整的对象。我想在ES中翻译此查询:

select from products where store_prices does not include { id: 503, price: 0 }

谢谢

1 个答案:

答案 0 :(得分:1)

如果你想要元组{id:503,price:0}不包含在元组数组中(并匹配整个元组,而不是" id"来自一个元组和"价格& #34;来自另一个),那么你就不能了。您需要嵌套对象。对此的最佳解释是here, in the documentation

为了实现这一点,您需要这个商店价格映射:

"store_prices": {
  "type": "nested", 
  "properties": {
    "price": {
      "type": "double"
    },
    "id": {
      "type": "integer"
    }
  }
}

要查询(过滤)上面的映射,您可以使用:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": [
            {
              "nested": {
                "path": "store_prices",
                "query": {
                  "bool": {
                    "must": [
                      { "match": {"store_prices.id": "503"}},
                      { "match": {"store_prices.price": "2.65"}}
                    ]
                  }}}}
          ]}}}
  }
}