如何映射然后在elasticsearch上查询嵌套数据

时间:2013-10-04 16:23:54

标签: elasticsearch

我正在尝试索引和查询弹性搜索中的简单嵌套数据,但收到以下错误:

"filter":[]}}}]]]; nested: QueryParsingException[[products] [_na] query malformed, no field after start_object]; }]

我的映射是:

{
  "product": {
    "properties": {
      "id": { "type": "integer", "store": true },
      "description": { "type": "string" },
      "kind": { "type": "string" },
      "name": { "type": "string", "store": true },
      "tags": {
        "type": "nested",
        "properties": {
          "label": {
            "type": "string",
            "index": "not_analyzed",
            "omit_norms": true,
            "index_options": "docs"
          },
          "slug": {
            "type": "string",
            "index": "not_analyzed",
            "omit_norms": true,
            "index_options": "docs"
          }
        }
      }
    }
  }
}

我在下面的查询中成功获得所有耳机:

{
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "must": {
                        "match": { "kind": "Headphone" }
                    },
                    "must_not": [],
                    "should": []
                }
            },
            "filter": []
        }
    }
}

我的问题是,在支持方面时,找到“带XX标签的耳机”或“带XX和YY标签的耳机(另一种查询)”的正确查询结构是什么?

我只是尝试将下面的查询部分与上面的查询合并,但我找不到“正确”的地方(键)来放置它:

{
    "nested": {
        "path": "tags",
        "filter": {
            "bool": {
                "must": {
                    "terms": {
                        "tags.slug": [ "discount", "black"],
                        "minimum_should_match": 1
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

首先,映射似乎没有效果。例如,正确的映射应包含properties而不是mapping。确保通过运行实际应用映射

curl "localhost:9200/products/product/_mapping?pretty"

搜索请求在顶层缺少query元素,而minimum_should_match过滤器不支持terms。因此,请求应如下所示:

{
    "query": {
        "nested": {
            "path": "tags",
            "filter": {
                "bool": {
                    "must": {
                        "terms": {
                            "tags.slug": [ "discount", "black"]
                        }
                    }
                }
            }
        }
    }
}'