为什么多个嵌套对象出现在此ElasticSearch查询中?

时间:2015-08-02 15:48:00

标签: database elasticsearch

this page的案例4中,查询会搜索所有低于70个单位的椅子:

some data http://voormedia.com/blog/2014/06/four-ways-to-index-relational-data-in-elasticsearch/images/products-and-sizes-brackets-view-9fe010cd.svg

curl localhost:9200/example/product/_search -d '{
  "query": {
    "filtered": {
      "query": {
        "match": {
          "name": "chair"
        }
      },
      "filter": {
        "numeric_range": {
          "size.height": {
            "lt": 70
          }
        }
      }
    }
  }
}'

结果:

  "hits": [
    {
      "_id": "0",
      "_source": {
        "product": "chair",
        "size": [
          {
            "width": 50,
            "height": 50,
            "depth": 50
          },
          {
            "width": 75,
            "height": 75,
            "depth": 75
          }
        ]
      }
    }
  ]

1)为什么两种椅子尺寸的ID都为0?

2)为什么响应显示另一把椅子的高度为75个单位?

1 个答案:

答案 0 :(得分:0)

1)作者希望显示1到N的关系。这意味着他的存储库中有两种类型的椅子:尺寸为50的椅子和尺寸为75的椅子。但它们都是椅子,椅子的id是0。

2)因为默认情况下ES不会返回部分结果,所以它会返回文档。在我们的例子中,我们有一个带有大小数组的椅子文档,其中包含2个对象:一个用于50维,一个用于75维。提供的查询可以选择是否整个文档。

如果您想将查询转换为英语,您可以说:带给我所有具有价值的文件" chair"在产品领域中,至少有一个size.height值低于70.

尽管文章的作者知识渊博,但我必须说我不喜欢这种试图在SQL世界到NOSQL实现之间直接流动的文章。如果它如此简单,一些大公司会编写一个自动脚本,将您的SQL模式转换为各种NOSQL格式。为了在NOSQL中正确建模数据,您必须了解您的产品,了解应该影响您的决策的因素,了解用例和数据。没有一个通用的解决方案可以告诉你:如果你在RDBMS中这样做,就像在ES中这样做。