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

}

}

}

]

}

}

}

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: