ElasticSearch Nested类型全文检索、聚合查询
Nested类型全文检索
- 创建索引
PUT /products1
{"mappings":{"properties":{"fulltext":{"type":"text"},
"name":{"type":"text",
"fields":{"keyword":{"type":"keyword",
"ignore_above":256}}},
"reviews":{"type":"nested",
"properties":{"rating":{"type":"integer"},
"author":{"type":"text",
"copy_to":"fulltext"},
"date":{"type":"date"}}}}}}
以上创建索引语句中实现全文检索重点为
"fulltext": { "type": "text" }
和
"copy_to": "fulltext"
,nested类型中哪个text类型的字段需要全文检索,就在字段上加
"copy_to": "fulltext"
- 添加数据
PUT /products1/_doc/1
{"name":"Product A",
"reviews":[{"rating":5,
"author":"Alice",
"date":"2021-01-01"},
{"rating":4,
"author":"Bob",
"date":"2021-01-02"}]}
PUT /products1/_doc/2
{"name":"Product B",
"reviews":[{"rating":1,
"author":"John",
"date":"2021-01-03"},
{"rating":2,
"author":"Mary",
"date":"2021-01-04"},
{"rating":3,
"author":"James",
"date":"2021-01-05"},
{"rating":4,
"author":"Elisabeth",
"date":"2021-01-06"},
{"rating":5,
"author":"Richard",
"date":"2021-01-07"}]}
PUT /products1/_doc/3
{"name":"Product C",
"reviews":[{"rating":1,
"author":"Alex",
"date":"2021-01-03"},
{"rating":2,
"author":"Alice",
"date":"2021-01-04"}]}
- 执行查询
POST products1/_search
{"query":{"simple_query_string":{"query":"Alice"}}}
- 结果如下,可以看到nested类型中包含Alice的数据也被检索出来了
{"took":2,
"timed_out": false,
"_shards":{"total":1,
"successful":1,
"skipped":0,
"failed":0},
"hits":{"total":{"value":2,
"relation":"eq"},
"max_score":0.5442147,
"hits":[{"_index":"products1",
"_type":"_doc",
"_id":"1",
"_score":0.5442147,
"_source":{"name":"Product A",
"reviews":[{"rating":5,
"author":"Alice",
"date":"2021-01-01"},
{"rating":4,
"author":"Bob",
"date":"2021-01-02"}]}},
{"_index":"products1",
"_type":"_doc",
"_id":"3",
"_score":0.5442147,
"_source":{"name":"Product C",
"reviews":[{"rating":1,
"author":"Alex",
"date":"2021-01-03"},
{"rating":2,
"author":"Alice",
"date":"2021-01-04"}]}}]}}
以上可以看到实现nested类型全文检索
nested类型聚合查询
还是在上面product1索引中测试
- 现在,您可以对嵌套文档执行嵌套聚合。例如,让我们计算每个产品的平均评分:
GET /products1/_search
{"size":0,
"aggs":{"聚合名称":{"terms":{"field":"name.keyword"},
"aggs":{"reviews":{"nested":{"path":"reviews"},
"aggs":{"average_rating":{"avg":{"field":"reviews.rating"}}}}}}}}
- 我们首先使用术语聚合为每个产品创建存储桶。然后,对于每个产品,我们运行嵌套聚合,以便我们可以访问嵌套文档的集合。最后,我们可以计算这些嵌套文档的指标聚合,在我们的示例中是平均评分
{"took":3,
"timed_out": false,
"_shards":{"total":1,
"successful":1,
"skipped":0,
"failed":0},
"hits":{"total":{"value":3,
"relation":"eq"},
"max_score": null,
"hits":[]},
"aggregations":{"products":{"doc_count_error_upper_bound":0,
"sum_other_doc_count":0,
"buckets":[{"key":"Product A",
"doc_count":1,
"reviews":{"doc_count":2,
"average_rating":{"value":4.5}}},
{"key":"Product B",
"doc_count":1,
"reviews":{"doc_count":5,
"average_rating":{"value":3.0}}},
{"key":"Product C",
"doc_count":1,
"reviews":{"doc_count":2,
"average_rating":{"value":1.5}}}]}}}
版权归原作者 sunshine的天空 所有, 如有侵权,请联系我们删除。