1、Text字段排序
場景:數(shù)據(jù)庫中按照某個字段排序,sql只需寫order by 字段名即可,如果es對一個text field
進行排序,es中無法排序。因為文檔入倒排索引表時,分詞存入,es無法知道此字段的真實值。這樣的結(jié)果往往不準確,因為分詞后是多個單詞,再排序就不是我們想要的結(jié)果了。
通常有兩種解決辦法:
- 將一個text field建立兩次索引,一個分詞,用來進行搜索;一個不分詞,用來進行排序。
- mapping時設置
fielddata:true
,按照第一個分詞進行字典序排序。這種方式也不是很準確,因為只是按照第一個分詞進行排序,后續(xù)的分詞不會參與排序。fielddata:true的排序是對text內(nèi)部分詞結(jié)果進行排序之后再進行外部排序的,效率低不推薦使用;
樣例如下:
首先建立索引
PUT /website
{
"mappings": {
"properties": {
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"content": {
"type": "text",
"fielddata": true
},
"post_date": {
"type": "date"
},
"author_id": {
"type": "long"
}
}
}
}
插入數(shù)據(jù)
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"
? ? }
? }
]
}
結(jié)果如下:
可以看出是以title的內(nèi)容進行排序
然后再看下"fielddata": true這種情況,對content進行排序
GET /website/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"content": {
"order": "desc"
}
}
]
}
結(jié)果如下:
結(jié)果是以分詞后的第一個單詞進行排序,排序結(jié)果不準確,所以不推薦使用。
2、Scroll分批查詢
場景:下載某一個索引中1億條數(shù)據(jù),到文件或是數(shù)據(jù)庫。
不能一下全查出來,這樣會造成系統(tǒng)內(nèi)存溢出。所以使用scoll滾動搜索技術,一批一批查詢。scoll搜索會在第一次搜索的時候,保存一個當時的視圖快照,之后只會基于該舊的視圖快照提供數(shù)據(jù)搜索,如果這個期間數(shù)據(jù)變更,是不會讓用戶看到的。每次發(fā)送scroll請求,我們還需要指定一個scoll參數(shù),指定一個時間窗口,每次搜索請求只要在這個時間窗口內(nèi)能完成就可以了。
假如有三億條數(shù)據(jù),這里實際只有3條
添加測試數(shù)據(jù)
PUT /book/_doc/1
{
"name": "Bootstrap開發(fā)",
"description": "Bootstrap是由Twitter推出的一個前臺頁面開發(fā)css框架,是一個非常流行的開發(fā)框架,此框架集成了多種頁面效果。此開發(fā)框架包含了大量的CSS、JS程序代碼,可以幫助開發(fā)者(尤其是不擅長css頁面開發(fā)的程序人員)輕松的實現(xiàn)一個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語言是世界第一編程語言,在軟件開發(fā)領域使用人數(shù)最多。",
"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開發(fā)基礎",
"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
}
首先獲取第一批次的數(shù)據(jù),這里只返回一條。
{
"_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開發(fā)",
"description" : "Bootstrap是一個非常流行的開發(fā)框架。此開發(fā)框架可以幫助不擅長css頁面開發(fā)的程序人員輕松的實現(xiàn)一個css,不受瀏覽器限制的精美界面css效果。",
"studymodel" : "201002",
"price" : 38.6,
"timestamp" : "2019-08-25 19:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"bootstrap",
"dev"
]
}
}
]
}
}
可以看到獲取到了第一條的數(shù)據(jù),獲得的結(jié)果里面包含有一個scoll_id,下一次再發(fā)送scoll請求的時候,必須帶上這個scoll_id,接下來獲取第二條數(shù)據(jù)
GET /_search/scroll
{
"scroll": "1m",
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAByQWQWx5bzRmTW9TeUNpNmVvN0E2dF9YQQ=="
}
獲取成功第二條數(shù)據(jù)
{
"_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語言是世界第一編程語言,在軟件開發(fā)領域使用人數(shù)最多。",
"studymodel" : "201001",
"price" : 68.6,
"timestamp" : "2019-08-25 19:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"java",
"dev"
]
}
}
]
}
}
每一次都帶上上一次的_scroll_id。,接下來獲取第三條數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-478115.html
GET /_search/scroll
{
"scroll": "1m",
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAByQWQWx5bzRmTW9TeUNpNmVvN0E2dF9YQQ=="
}
成功獲取第三條數(shù)據(jù):文章來源地址http://www.zghlxwxcb.cn/news/detail-478115.html
{
"_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開發(fā)基礎",
"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"
]
}
}
]
}
}
到了這里,關于ElasticSearch7.3學習(二十二)----Text字段排序、Scroll分批查詢場景解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!