在Elasticsearch查询中同时使用术语过滤器和范围过滤器

3
在我的Elasticsearch索引中,我有以下两个已索引的文档:
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
                  }
               ]
            }
         }
      ]
   }
}

请尝试访问以下链接:http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/query-dsl-numeric-range-filter.html - undefined_variable
1
@Undefined_variable 不确定你的意思。我知道我需要使用范围过滤器,问题是如何使用。 - tugberk
1
使用AND过滤器进行过滤,详情请参见http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/query-dsl-and-filter.html - undefined_variable
2个回答

5

我找到了答案。这篇帖子帮了我很多: ElasticSearch – 嵌套映射和过滤器

更改了类型的映射:

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

通过将属性设置为嵌套类型,我能够保持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
我非常感谢你分享你的发现,谢谢! - blong

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接