es从某个字段中的相同数据取任意一个数据

更新时间:2023-07-14 22:11:40 阅读: 评论:0

es从某个字段中的相同数据取任意⼀个数据
So,什么是字段折叠,可以理解就是按特定字段进⾏合并去重,⽐如我们有⼀个菜谱搜索,我希望按菜谱的“菜系”字段进⾏折叠,即返回结果每个菜系都返回⼀个结果,也就是按菜系去重,我搜索关键字“鱼”,要去返回的结果⾥⾯各种菜系都有,有湘菜,有粤菜,有中餐,有西餐,别全是湘菜,就是这个意思,通过按特定字段折叠之后,来丰富搜索结果的多样性。时光近义词
说到这⾥,有⼈肯定会想到,使⽤ term agg+ top hits agg 来实现啊,这种组合两种聚和的⽅式可以实现上⾯的功能,不过也有⼀些局限性,⽐如,不能分页,;结果不够精确(top term+top hits,es 的聚合实现选择了牺牲精度来提⾼速度);数据量⼤的情况下,聚合⽐较慢,影响搜索体验。
⽽新的的字段折叠的⽅式是怎么实现的的呢,有这些要点:
1. 折叠+取 inner_hits 分两阶段执⾏(组合聚合的⽅式只有⼀个阶段),所以 top hits 永远是精确的。
2. 字段折叠只在 top hits 层执⾏,不需要每次都在完整的结果集上对为每个折叠主键计算实际的 doc values 值,只对 top hits 这⼩部分数据操
作就可以,和 term agg 相⽐要节省很多内存。
3. 因为只在 top hits 上进⾏折叠,所以相⽐组合聚合的⽅式,速度要快很多。
4. 折叠 top docs 不需要使⽤全局序列(global ordinals)来转换 string,相⽐ agg 这也节省了很多内存。
5. 分页成为可能,和常规搜索⼀样,具有相同的局限,先获取 from+size 的内容,再合并。
6. arch_after 和 scroll 暂未实现,不过具备可⾏性。
7. 折叠只影响搜索结果,不影响聚合,搜索结果的 total 是所有的命中纪录数,去重的结果数未知(⽆法计算)。
下⾯来看看具体的例⼦,就知道怎么回事了,使⽤起来很简单。
先准备索引和数据,这⾥以菜谱为例,name:菜谱名,type 为菜系,rating 为⽤户的累积平均评分
DELETE recipes
PUT recipes
POST recipes/type/_mapping
{
"properties": {
"name":{
"type": "text"
},
"rating":{
"type": "float"
},"type":{
"type": "keyword"
}
}
}
POST recipes/type/
{
"name":"清蒸鱼头","rating":1,"type":"湘菜"
}
POST recipes/type/
{
调研模板"name":"剁椒鱼头","rating":2,"type":"湘菜"
}
POST recipes/type/
{
"name":"红烧鲫鱼","rating":3,"type":"湘菜"
}
POST recipes/type/
{
"name":"鲫鱼汤(辣)","rating":3,"type":"湘菜"
}
POST recipes/type/
{
"name":"鲫鱼汤(微辣)","rating":4,"type":"湘菜"
}
POST recipes/type/
{
己亥杂诗龚自珍
"name":"鲫鱼汤(变态辣)","rating":5,"type":"湘菜"
}
POST recipes/type/
{
"name":"⼴式鲫鱼汤","rating":5,"type":"粤菜"
}
POST recipes/type/
{
"name":"鱼⾹⾁丝","rating":2,"type":"川菜"
}
POST recipes/type/
{
"name":"奶油鲍鱼汤","rating":2,"type":"西菜"
}
现在我们看看普通的查询效果是怎么样的,搜索关键字带“鱼”的菜,返回3条数据
POST recipes/type/_arch
{
"query": {"match": {
"name": "鱼"
}},"size": 3
}
全是湘菜,我的天,最近上⽕不想吃辣,这个第⼀页的结果对我来说就是垃圾,如下:
{
"took": 2,
"timed_out": fal,
"_shards": {梦到跟人吵架
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 9,
"max_score": 0.26742277,
"hits": [
{
"_index": "recipes",
"_type": "type",
"_id": "AVoESHYF_OA-dG63Txsd",
"_score": 0.26742277,
"_source": {
"name": "鲫鱼汤(变态辣)",
"rating": 5,
"type": "湘菜"
}
},
{
"_index": "recipes",
"_type": "type",
"_id": "AVoESHXO_OA-dG63Txsa",
"_score": 0.19100356,
"_source": {
"name": "红烧鲫鱼",
"rating": 3,
"type": "湘菜"
}
},
{
"_index": "recipes",
"_type": "type",
"_id": "AVoESHWy_OA-dG63TxsZ",
"_score": 0.19100356,
"_source": {
"name": "剁椒鱼头",
"rating": 2,
"type": "湘菜"
}
}
回到恐龙时代]
}
}
我们再看看,这次我想加个评分排序,⼤家都喜欢的是那些,看看有没有喜欢吃的,执⾏查询:
POST recipes/type/_arch
{
"query": {"match": {
"name": "鱼"
}},"sort": [
{
"rating": {
"order": "desc"
}
}
],"size": 3
}
结果稍微好点了,不过3个⾥⾯2个是湘菜,还是有点不合适,结果如下:
{
"took": 1,
"timed_out": fal,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
休庆
"hits": {
"total": 9,
"max_score": null,
"hits": [
{
"_index": "recipes",
"_type": "type",
"_id": "AVoESHYF_OA-dG63Txsd",
"_score": null,
"_source": {
"name": "鲫鱼汤(变态辣)",
"rating": 5,
"type": "湘菜"
},
"sort": [
我心亦然
5
]
},
{
"_index": "recipes",
"_type": "type",
"_id": "AVoESHYW_OA-dG63Tx",
"_score": null,
"_source": {
"name": "⼴式鲫鱼汤",
"rating": 5,
"type": "粤菜"
描写四季的段落},
"sort": [
5
]
},
{
"_index": "recipes",
"_type": "type",
"_id": "AVoESHX7_OA-dG63Txsc",
"_score": null,
"_source": {
"name": "鲫鱼汤(微辣)",
"rating": 4,
"type": "湘菜"
},
"sort": [
4
]
}
]
}
}
现在我知道了,我要看看其他菜系,这家不是还有西餐、⼴东菜等各种菜系的么,来来,帮我每个菜系来⼀个菜看看,换 terms agg 先得到唯⼀的 term 的bucket,再组合 top_hits agg,返回按评分排序的第⼀个 top hits,有点复杂,没关系,看下⾯的查询就知道了:

本文发布于:2023-07-14 22:11:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1081634.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结果   搜索   折叠   聚合   菜系   看看   影响
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图