术语和范围在elasticsearch查询中一起过滤

时间:2014-09-21 13:04:46

标签: elasticsearch

在我的eleasticsearch索引中,我有两个索引如下的文档:

POST dyn-props/item
{
    "name": "bar foo",
    "properties": [
        {
            "type": "foo",
            "value": 1.45
        },

        {
            "type": "bar",
            "value": 256.34
        },

        {
            "type": "foobar",
            "value": 43.43
        }
    ]
}

POST dyn-props/item
{
    "name": "foo bar",
    "properties": [
        {
            "type": "foo",
            "value": 33.34
        },

        {
            "type": "bar",
            "value": 22.23
        }
    ]
}

在此商品类型上,我想查询具有 foo 属性且价值大于 10 的商品。我可以使用以下查询过滤掉具有 foo 类型属性的项目的结果:

POST dyn-props/item/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "term": {
               "properties.type": "foo"
            }
         }
      }
   }
}

但我不确定如何为应用范围过滤器。有什么想法吗?

修改

发出以下查询给出了错误的结果:

POST dyn-props/item/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
           "bool": {
             "must": [
               {
                  "term": {
                     "properties.type": "foo"
                  }
               },

                {
                   "range": {
                      "properties.value": {
                        "gte" : 10
                      }
                   }
                }
             ]
           }
         }
      }
   }
}

结果:

{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 1,
      "hits": [
         {
            "_index": "dyn-props",
            "_type": "item",
            "_id": "PetPVxwARLOcZqlv28xjpw",
            "_score": 1,
            "_source": {
               "name": "bar foo",
               "properties": [
                  {
                     "type": "foo",
                     "value": 1.45
                  },
                  {
                     "type": "bar",
                     "value": 256.34
                  },
                  {
                     "type": "foobar",
                     "value": 43.43
                  }
               ]
            }
         },
         {
            "_index": "dyn-props",
            "_type": "item",
            "_id": "KqOTXcC9RG6FzPsDDDs8Hw",
            "_score": 1,
            "_source": {
               "name": "foo bar",
               "properties": [
                  {
                     "type": "foo",
                     "value": 33.34
                  },
                  {
                     "type": "bar",
                     "value": 22.23
                  }
               ]
            }
         }
      ]
   }
}

2 个答案:

答案 0 :(得分:5)

找到答案。这篇文章有很多帮助:ElasticSearch – nested mappings and filters

更改了类型的映射:

PUT dyn-props
{
    "mappings": {
         "item": {
                "properties": {
                     "name": {
                            "type": "string"
                     },
                     "properties": {
                            "type": "nested"
                     }
                }
         }
    }
}

通过将属性设为nested type,我能够维持typevalue字段之间的关联。

最后,我能够为此发出嵌套查询:

POST dyn-props/item/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "nested": {
               "path": "properties",
               "filter": {
                  "bool": {
                     "must": [
                        {
                           "term": {
                              "type": "foo"
                           }
                        },
                        {
                           "range": {
                              "value": {
                                 "gte": 10
                              }
                           }
                        }
                     ]
                  }
               }
            }
         }
      }
   }
}

这让我得到了正确的结果:

{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "dyn-props",
            "_type": "item",
            "_id": "CzTL4sseR2GVYtvf-0slVQ",
            "_score": 1,
            "_source": {
               "name": "foo bar",
               "properties": [
                  {
                     "type": "foo",
                     "value": 33.34
                  },
                  {
                     "type": "bar",
                     "value": 22.23
                  }
               ]
            }
         }
      ]
   }
}

答案 1 :(得分:2)

您必须更改索引的映射并将属性的类型更改为嵌套。

此案例已在文档中解释: http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/