檢索排序 & 分頁
- 1.測試數據準備
- 2.排序功能
- 2.1 簡單字段排序
- 2.2 多字段排序
- 2.3 日期排序
- 3.分頁功能
- 3.1 基礎分頁
- 3.2 深度分頁(不推薦大數據量使用)
- 3.3 使用 search_after 進行高效分頁
- 4.綜合示例:高亮+排序+分頁
- 5.實踐建議
1.測試數據準備
首先,我們創建一個名為 blog_posts
的索引,并插入一些測試數據:
PUT /blog_posts
{"mappings": {"properties": {"title": { "type": "text" },"content": { "type": "text" },"author": { "type": "keyword" },"views": { "type": "integer" },"publish_date": { "type": "date" },"tags": { "type": "keyword" }}}
}
POST /blog_posts/_bulk
{"index":{}}
{"title":"Elasticsearch Basics","content":"Learn the basics of Elasticsearch and how to perform simple queries.","author":"John Doe","views":1500,"publish_date":"2023-01-15","tags":["search","database"]}
{"index":{}}
{"title":"Advanced Search Techniques","content":"Explore advanced search techniques in Elasticsearch including aggregations and filters.","author":"Jane Smith","views":3200,"publish_date":"2023-02-20","tags":["search","advanced"]}
{"index":{}}
{"title":"Data Analytics with ELK","content":"How to use the ELK stack for data analytics and visualization.","author":"John Doe","views":2800,"publish_date":"2023-03-10","tags":["analytics","elk"]}
{"index":{}}
{"title":"Elasticsearch Performance Tuning","content":"Tips and tricks for optimizing Elasticsearch performance in production environments.","author":"Mike Johnson","views":4200,"publish_date":"2023-04-05","tags":["performance","optimization"]}
{"index":{}}
{"title":"Kibana Dashboard Guide","content":"Creating effective dashboards in Kibana for monitoring and analysis.","author":"Jane Smith","views":1900,"publish_date":"2023-05-12","tags":["kibana","visualization"]}
2.排序功能
能排序的字段都具備正排索引,單 text
類型字段是不可以排序的。如果要使 text
字段支持排序、聚合,則需要開啟 fielddata
。
sort
是和 query
平級的,并不會被 query
包含。
2.1 簡單字段排序
GET /blog_posts/_search
{"query": {"match_all": {}},"sort": [{"views": {"order": "desc"}}]
}
2.2 多字段排序
GET /blog_posts/_search
{"query": {"match_all": {}},"sort": [{"author": {"order": "asc"}},{"views": {"order": "desc"}}]
}
2.3 日期排序
GET /blog_posts/_search
{"query": {"match_all": {}},"sort": [{"publish_date": {"order": "desc"}}]
}
3.分頁功能
Elasticsearch 支持對查詢結果進行分頁處理,允許用戶逐步獲取和瀏覽大量數據。
在編寫查詢語句時,可通過再請求體中添加 from
和 size
字段實現分頁。from
表示結果集的起始位置,而 size
表示每頁返回的文檔數量。
如果將 from
設置為 11 11 11,size
設置為 5 5 5,則返回的是第 10 10 10 ~ 14 14 14 條數據(默認從第 0 0 0 條開始)。
3.1 基礎分頁
GET /blog_posts/_search
{"query": {"match_all": {}},"from": 0,"size": 2,"sort": [{"publish_date": {"order": "desc"}}]
}
3.2 深度分頁(不推薦大數據量使用)
深度分頁 指的是在 Elasticsearch 中查詢結果集 非常靠后的頁碼(例如第 1000 1000 1000 頁,每頁 10 10 10 條數據,即 from=10000
)。它通常表現為使用 from + size
參數組合來獲取遠端的分頁數據。
? 不推薦的詳細原因可參考我的另一篇博客:《【Elasticsearch】深度分頁及其替代方案》。
當然,我們這里測試的數據沒有那么多。
GET /blog_posts/_search
{"query": {"match_all": {}},"from": 3,"size": 2
}
3.3 使用 search_after 進行高效分頁
首先獲取第一頁:
GET /blog_posts/_search
{"query": {"match_all": {}},"size": 2,"sort": [{"views": {"order": "desc"}},{"_id": {"order": "asc"}}]
}
然后使用最后一個結果的排序值獲取下一頁:
GET /blog_posts/_search
{"query": {"match_all": {}},"size": 2,"search_after": [3200, "上一頁最后一個文檔的ID"],"sort": [{"views": {"order": "desc"}},{"_id": {"order": "asc"}}]
}
4.綜合示例:高亮+排序+分頁
GET /blog_posts/_search
{"query": {"multi_match": {"query": "search","fields": ["title", "content"]}},"highlight": {"fields": {"title": {},"content": {"fragment_size": 100,"number_of_fragments": 2}}},"sort": [{"views": {"order": "desc"}}],"from": 0,"size": 3
}
5.實踐建議
功能 | |
---|---|
高亮 |
|
排序 |
|
分頁 |
|