elastic:HOW-TO搜索嵌套字段? [不工作]

时间:2015-11-14 23:36:05

标签: elasticsearch nested

如果我有一个索引到Elasticsearch的JSON文档,如下所示:

"_source": {
          "pid_no": 19321,
          "aggregator_id": null,
          "inet_family": "ipv4-unicast",
          "origin_code": "igp",
          "extended_community": null,
          "atomic_aggregate": null,
          "adv_type": "announce",
          "local_preference": 250,
          "med_metric": 0,
          "time_stamp": 1447534931,
          "net_mask": "23",
          "prefix4_": {
            "last": 222,
            "first": 111
          },
          "counter_no": 69668,
          "confederation_path": "",
          "as_set": null,

我试过成功过滤了doc的所有键, 但是,除了嵌套的那些。

查询如下:

GET /SNIP!/SNIP!/_search?routing=SNIP! 
{
  "query": {
    "bool": {
      "must": {
        "query": {
          "match_all": {}
        }
      },
      "filter": {
        "bool": {
          "filter": [
            {
              "range": {
                "local_preference": {
                  "gt": 150,
                  "lte": 250
                }
              }
            },
>>> if i remove the filter below, matches the document.
>>> when i apply the filter, i get 0 hits
            {
              "and": [
                {
                  "range": {
                    "prefix4_.first": {
                      "lte": 200
                    }
                  }
                },
                {
                  "range": {
                    "prefix4_.last": {
                      "gte": 200
                    }
                  }
                }
              ]
            }
          ]
        }
      }
    }
  }
}

不言而喻,映射是使用相应字段中的整数完成的(prefix4_.first,prefix4_.last)

你能告诉我为什么过滤不起作用吗?

编辑:映射看起来像这样

{
    "mappings": {
        "_default_": {
            "_all": { "enabled": False },
            "dynamic": True,
            "_routing": { "required": True },
            "properties": {
                "pid_no": { "type": "string", "index": "not_analyzed", "store": "no" },
                "counter_no": { "type": "long", "store": "no" },
                "time_stamp": { "type": "date", "format": "epoch_second", "store": "no" },
                "host_name": { "type": "string", "index": "not_analyzed", "store": "no" },
                "local_ip": { "type": "ip", "store": "no" },
                "peer_ip": { "type": "ip", "store": "no" },
                "local_asn": { "type": "string", "index": "not_analyzed", "store": "no" },
                "peer_asn": { "type": "string", "index": "not_analyzed", "store": "no" },

                "inet_family": { "type": "string", "index": "not_analyzed", "store": "no" },
                "next_hop": { "type": "ip", "store": "no" },
                "net_block": { "type": "string", "index": "analyzed", "store": "no" },

                "as_path": { "type": "string", "index": "analyzed", "store": "no" },
                "cluster_list": { "type": "string", "index": "not_analyzed", "store": "no" },
                "confederation_path": { "type": "string", "index": "not_analyzed", "store": "no" },
                "local_preference": { "type": "integer", "store": "no" },
                "originator_ip": { "type": "ip", "store": "no" },
                "origin_code": { "type": "string", "index": "not_analyzed", "store": "no" },
                "community_note": { "type": "string", "index": "analyzed", "store": "no" },
                "med_metric": { "type": "long", "store": "no" },
                "atomic_aggregate": { "type": "boolean", "store": "no" },
                "aggregator_id": { "type": "string", "index": "analyzed", "store": "no" },
                "as_set": { "type": "string", "index": "analyzed", "store": "no" },
                "extended_community": { "type": "string", "index": "not_analyzed", "store": "no" },

                "adv_type": { "type": "string", "index": "not_analyzed", "store": "no" },

                "prefix_": { "type": "string", "index": "not_analyzed", "store": "no" },
                "net_mask": { "type": "integer", "store": "no" },
                "prefix4_": {
                    "type": "nested",
                    "properties": {
                        "first": { "type": "integer", "store": "no" },
                        "last": { "type": "integer", "store": "no" }
                    }
                },
                "prefix6_": {
                    "type": "nested",
                    "properties": {
                        "lofirst": { "type": "long", "store": "no" },
                        "lolast": { "type": "long", "store": "no" },
                        "hifirst": { "type": "long", "store": "no" },
                        "hilast": { "type": "long", "store": "no" }
                    }
                }

            }
        }
    },
    "settings" : {
        "number_of_shards": 1,
        "number_of_replicas": 0,
        "index": {
            "store.throttle.type": "none",
            "memory.index_buffer_size": "20%",
            "refresh_interval": "1m",
            "merge.async": True,
            "merge.scheduler.type": "concurrent",
            "merge.policy.type": "log_byte_size",
            "merge.policy.merge_factor": 15,
            "cache.query.enable": True,
            "cache.filter.type": "node",
            "fielddata.cache.type": "node",
            "cache.field.type": "soft"
        }
    }
}

2 个答案:

答案 0 :(得分:1)

Elasticsearch提供了多种映射嵌套文档的方法。您正在使用nested将嵌套文档编入索引作为单独的文档,因此查询它们需要使用nested query

如您所示,对嵌套JSON编制索引的最简单方法是使用object类型映射。这将允许您以您期望的方式查询字段,但是Elasticsearch会对您可能无法接受的层次结构进行展平。

答案 1 :(得分:0)

使用嵌套过滤器在嵌套字段上过滤文档。 https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-nested-filter.html

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "peer_ip": "pqr",
                                "_cache": true
                            }
                        },
                        {
                            "nested": {
                                "filter": {
                                    "bool": {
                                        "must": [
                                            {
                                                "terms": {
                                                    "first": [
                                                        "xyz"
                                                    ],
                                                    "_cache": true
                                                }
                                            }
                                        ]
                                    }
                                },
                                "path": "prefix4_",
                                "inner_hits": {}
                            }
                        },
                        {
                            "terms": {
                                "pid_no": [
                                    "yyu"
                                ],
                                "_cache": true
                            }
                        }
                    ]
                }
            }
        }
    }
}