在Elasticsearch 7.3中,对于Text字段排序和Scroll分批查询的实战场景解析如下:
Text字段排序
Elasticsearch中的Text字段默认会被分析为词项,并不会保留原始的完整文本,因此无法直接对Text字段进行排序。如果想要对包含全文内容的字段进行排序,正确的做法是为该字段设置一个 .keyword
子字段,该子字段会作为一个未分析的Keyword类型字段,用于排序或聚合操作。
例如,对于一个名为description
的Text字段,可以在映射中加入一个.keyword
子字段:
PUT my_index
{
"mappings": {
"properties": {
"description": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
然后就可以针对description.keyword
字段进行排序:
GET my_index/_search
{
"sort": [
{ "description.keyword": { "order": "asc" } }
]
}
Scroll分批查询场景解析
Scroll API在Elasticsearch中用于高效的批量获取大量数据,特别适用于一次性获取所有满足条件的文档或者做数据迁移的场景。相比于普通的搜索请求(分页查询),Scroll API在第一次请求时保存了上下文信息,后续的Scroll请求可以根据上下文信息直接获取下一批数据,无需重新计算分数和排序,因此性能更好。
使用Scroll API的基本步骤如下:
- 初始化Scroll请求并执行查询,指定一个合适的
scroll
生存时间和搜索条件:
POST my_index/_search?scroll=1m
{
"size": 1000, // 每次获取的文档数量
"query": {
"match_all": {}
}
}
- 获取第一个Scroll结果集,响应中会包含一个
_scroll_id
字段:
{
"_scroll_id": "DX...",
"took": 12,
"timed_out": false,
"_shards": {...},
"hits": {...} // 第一批数据
}
- 使用
_scroll_id
执行Scroll请求获取下一批数据:
POST /_search/scroll
{
"scroll": "1m", // 继续使用之前设定的生存时间
"scroll_id": "DX..."
}
重复步骤3直到获取完所有数据或者达到预期的文档数量。需要注意的是,Scroll请求会一直占用集群资源,直到Scroll会话超时,所以在完成数据读取后,应使用Clear Scroll API清除Scroll会话以释放资源:
DELETE /_search/scroll
{
"scroll_id": ["DX..."] // 清除多个Scroll ID时可传入数组
}