在ElasticSearch上查询嵌套文档

时间:2016-03-22 10:33:06

标签: elasticsearch nested-queries

我的nested_filter不起作用,甚至我的嵌套查询。 我已经创建了这样的映射:

curl -XPUT 'localhost:9200/i_part' -d '
{
  "mappings": {
    "part2": {
      "properties": {
         "p_name": {
             "type":   "string", "index":  "not_analyzed"
        },
        "lineorder": {
          "type": "nested",
           "properties": {
                "lo_quantity": {"type":"integer"},
                "lo_discount": {"type":"integer"}, 
                "lo_shippriority": {"type":   "string", "index":  "not_analyzed"},
                "lo_shipmode": {"type":   "string", "index":  "not_analyzed"},
                "customer"{
                    "properties":{
                      "c_name": {"type":   "string", "index":  "not_analyzed"}
                        }
                 }
            }
}
}
}
}
}

但是当我查询它时,它会返回所有文档。

curl -XPOST 'localhost:9200/i_part/part2/_search?pretty' -d '
{
  "query": {
    "filtered": {
      "filter": {
        "nested" : {
          "path" : "lineorder",
          "filter": {
              "and": [
                {
                  "match" : {
                    "lineorder.lo_shipmode":"RAIL|"
                  }
                },
                {
                  "match" : {
                    "lineorder.lo_orderpriority":"1-URGENT"
                  }
                }
              ]
          }
        }
      }
    }
  },       
  "query": {
    "bool": {
      "must": [
        { "match": { "p_partkey": 1 }}, 
        {
          "nested": {
            "path": "lineorder", 
            "query": {
              "bool": {
                "must": [ 
                  {"match": {"lineorder.lo_shipmode":"RAIL|"}},
                  {"match" : {"lineorder.lo_orderpriority":"1-URGENT"}}
                ]
        }}}}
      ]
}}
}'

或者这样

curl -XGET 'localhost:9200/i_part/part2/_search?pretty' -d '
{
  "query": {
    "nested": { 
      "path": "lineorder",
      "filter": {
        "range": {
          "lineorder.lo_discount": {
            "gte": 2,
            "lt": 4
          }
        }
      }
    }
  },
  "sort": {
    "lineorder.lo_discount": { 
      "order": "asc",     
      "nested_filter": { 
        "range": {
          "lineorder.lo_discount": {
            "gte": 2,
            "lt": 4
          }
        }
      }
    }
  }
}'

我做错了什么?我想查询嵌套字段而不是父/子,因为我的数据太大,无法将子项链接到父项。

我的数据是这样的:

{
    "p_name": "lace spring",
    "lineorder": [{
                "customer": [{
                    "c_name": "Customer#000014704",
                }],
                "lo_quantity": 49,
                "lo_orderpriority": "1-URGENT",
                "lo_discount": 3,
                "lo_shipmode": "RAIL|",
                "lo_tax": 0
            }, {
                "customer": [{
                    "c_name": "Customer#000026548",
                }],
                "lo_quantity": 15,
                "lo_orderpriority": "3-MEDIUM",
                "lo_discount": 10,
                "lo_shipmode": "SHIP|",
                "lo_tax": 0
            }]}

1 个答案:

答案 0 :(得分:1)

如果您想自己过滤lineorder,请使用inner hits