ElasticSearch7.3学习(二十二)----Text字段排序、Scroll分批查询场景
1、Text字段排序
场景:数据库中按照某个字段排序,sql只需写order by 字段名即可,如果es对一个text field
进行排序,es中无法排序。因为文档入倒排索引表时,分词存入,es无法知道此字段的真实值。这样的结果往往不准确,因为分词后是多个单词,再排序就不是我们想要的结果了。
通常有两种解决办法:
- 将一个text field建立两次索引,一个分词,用来进行搜索;一个不分词,用来进行排序。
- mapping时设置
fielddata:true
,按照第一个分词进行字典序排序。这种方式也不是很准确,因为只是按照第一个分词进行排序,后续的分词不会参与排序。fielddata:true的排序是对text内部分词结果进行排序之后再进行外部排序的,效率低不推荐使用;
样例如下:
首先建立索引
-
PUT /website
-
{
-
"mappings": {
-
"properties": {
-
"title": {
-
"type": "text",
-
"fields": {
-
"keyword": {
-
"type": "keyword"
-
}
-
}
-
},
-
"content": {
-
"type": "text",
-
"fielddata": true
-
},
-
"post_date": {
-
"type": "date"
-
},
-
"author_id": {
-
"type": "long"
-
}
-
}
-
}
-
}
插入数据
-
PUT /website/_doc/1
-
{
-
"title": "first article",
-
"content": "this is my second article",
-
"post_date": "2019-01-01",
-
"author_id": 110
-
}
-
-
PUT /website/_doc/2
-
{
-
"title": "second article",
-
"content": "this is my second article",
-
"post_date": "2019-01-01",
-
"author_id": 110
-
}
-
-
PUT /website/_doc/3
-
{
-
"title": "third article",
-
"content": "this is my third article",
-
"post_date": "2019-01-02",
-
"author_id": 110
-
}
搜索,按照整个title的值进行排序
-
GET /website/_search
-
{
-
"query": {
-
"match_all": {}
-
},
-
"sort": [
-
{
-
"title.keyword": {
-
"order": "desc"
-
}
-
}
-
]
-
}
结果如下:
可以看出是以title的内容进行排序
然后再看下"fielddata": true这种情况,对content进行排序
-
GET /website/_search
-
{
-
"query": {
-
"match_all": {}
-
},
-
"sort": [
-
{
-
"content": {
-
"order": "desc"
-
}
-
}
-
]
-
}
结果如下:
结果是以分词后的第一个单词进行排序,排序结果不准确,所以不推荐使用。
2、Scroll分批查询
场景:下载某一个索引中1亿条数据,到文件或是数据库。
不能一下全查出来,这样会造成系统内存溢出。所以使用scoll滚动搜索技术,一批一批查询。scoll搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜索,如果这个期间数据变更,是不会让用户看到的。每次发送scroll请求,我们还需要指定一个scoll参数,指定一个时间窗口,每次搜索请求只要在这个时间窗口内能完成就可以了。
假如有三亿条数据,这里实际只有3条
添加测试数据
-
PUT /book/_doc/1
-
{
-
"name": "Bootstrap开发",
-
"description": "Bootstrap是由Twitter推出的一个前台页面开发css框架,是一个非常流行的开发框架,此框架集成了多种页面效果。此开发框架包含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长css页面开发的程序人员)轻松的实现一个css,不受浏览器限制的精美界面css效果。",
-
"studymodel": "201002",
-
"price": 38.6,
-
"timestamp": "2019-08-25 19:11:35",
-
"pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
-
"tags": [
-
"bootstrap",
-
"dev"
-
]
-
}
-
-
PUT /book/_doc/2
-
{
-
"name": "java编程思想",
-
"description": "java语言是世界第一编程语言,在软件开发领域使用人数最多。",
-
"studymodel": "201001",
-
"price": 68.6,
-
"timestamp": "2019-08-25 19:11:35",
-
"pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
-
"tags": [
-
"java",
-
"dev"
-
]
-
}
-
-
PUT /book/_doc/3
-
{
-
"name": "spring开发基础",
-
"description": "spring 在java领域非常流行,java程序员都在用。",
-
"studymodel": "201001",
-
"price": 88.6,
-
"timestamp": "2019-08-24 19:11:35",
-
"pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
-
"tags": [
-
"spring",
-
"java"
-
]
-
}
搜索
-
GET /book/_search?scroll=1m
-
{
-
"query": {
-
"match_all": {}
-
},
-
"size": 1
-
}
首先获取第一批次的数据,这里只返回一条。
-
{
-
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAByQWQWx5bzRmTW9TeUNpNmVvN0E2dF9YQQ==",
-
"took" : 0,
-
"timed_out" : false,
-
"_shards" : {
-
"total" : 1,
-
"successful" : 1,
-
"skipped" : 0,
-
"failed" : 0
-
},
-
"hits" : {
-
"total" : {
-
"value" : 3,
-
"relation" : "eq"
-
},
-
"max_score" : 1.0,
-
"hits" : [
-
{
-
"_index" : "book",
-
"_type" : "_doc",
-
"_id" : "1",
-
"_score" : 1.0,
-
"_source" : {
-
"name" : "Bootstrap开发",
-
"description" : "Bootstrap是一个非常流行的开发框架。此开发框架可以帮助不擅长css页面开发的程序人员轻松的实现一个css,不受浏览器限制的精美界面css效果。",
-
"studymodel" : "201002",
-
"price" : 38.6,
-
"timestamp" : "2019-08-25 19:11:35",
-
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
-
"tags" : [
-
"bootstrap",
-
"dev"
-
]
-
}
-
}
-
]
-
}
-
}
可以看到获取到了第一条的数据,获得的结果里面包含有一个scoll_id,下一次再发送scoll请求的时候,必须带上这个scoll_id,接下来获取第二条数据
-
GET /_search/scroll
-
{
-
"scroll": "1m",
-
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAByQWQWx5bzRmTW9TeUNpNmVvN0E2dF9YQQ=="
-
}
获取成功第二条数据
-
{
-
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAByQWQWx5bzRmTW9TeUNpNmVvN0E2dF9YQQ==",
-
"took" : 1,
-
"timed_out" : false,
-
"terminated_early" : true,
-
"_shards" : {
-
"total" : 1,
-
"successful" : 1,
-
"skipped" : 0,
-
"failed" : 0
-
},
-
"hits" : {
-
"total" : {
-
"value" : 3,
-
"relation" : "eq"
-
},
-
"max_score" : 1.0,
-
"hits" : [
-
{
-
"_index" : "book",
-
"_type" : "_doc",
-
"_id" : "2",
-
"_score" : 1.0,
-
"_source" : {
-
"name" : "java编程思想",
-
"description" : "java语言是世界第一编程语言,在软件开发领域使用人数最多。",
-
"studymodel" : "201001",
-
"price" : 68.6,
-
"timestamp" : "2019-08-25 19:11:35",
-
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
-
"tags" : [
-
"java",
-
"dev"
-
]
-
}
-
}
-
]
-
}
-
}
每一次都带上上一次的_scroll_id。,接下来获取第三条数据。
-
GET /_search/scroll
-
{
-
"scroll": "1m",
-
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAByQWQWx5bzRmTW9TeUNpNmVvN0E2dF9YQQ=="
-
}
成功获取第三条数据:
-
{
-
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAByQWQWx5bzRmTW9TeUNpNmVvN0E2dF9YQQ==",
-
"took" : 1,
-
"timed_out" : false,
-
"terminated_early" : true,
-
"_shards" : {
-
"total" : 1,
-
"successful" : 1,
-
"skipped" : 0,
-
"failed" : 0
-
},
-
"hits" : {
-
"total" : {
-
"value" : 3,
-
"relation" : "eq"
-
},
-
"max_score" : 1.0,
-
"hits" : [
-
{
-
"_index" : "book",
-
"_type" : "_doc",
-
"_id" : "3",
-
"_score" : 1.0,
-
"_source" : {
-
"name" : "spring开发基础",
-
"description" : "spring 在java领域非常流行,java程序员都在用。",
-
"studymodel" : "201001",
-
"price" : 88.6,
-
"timestamp" : "2019-08-24 19:11:35",
-
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
-
"tags" : [
-
"spring",
-
"java"
-
]
-
}
-
}
-
]
-
}
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggegfe
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13