Elasticsearch Document Get API详解、原理与示例,linux虚拟机使用教程

本文详细介绍了Elasticsearch的Document Get API,包括storedFields和FetchSourceContext的使用,以及如何进行字段过滤。通过示例演示了如何获取特定字段,并分析了Get API的实时性机制。此外,还探讨了storedFields和FetchSourceContext在字段过滤中的不同作用,解释了为何示例二中未返回预期结果的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • private String[] storedFields:显示的指定需要返回的字段,默认会返回_source中所有字段。

  • private FetchSourceContext fetchSourceContext:指定需要返回字段的上下文,是storedFields的补充与完善,支持通配符,下文会详细分析。

  • private boolean refresh = false:是否刷新。

  • boolean realtime = true:是否实时执行,默认为true。

  • private VersionType versionType = VersionType.INTERNAL:版本类型,已在《Elasticsearch Document Get API详解、原理与示例》中详细介绍

  • private long version = Versions.MATCH_ANY:数据版本,关于数据的版本管理,已在《Elasticsearch Document Get API详解、原理与示例》中详细介绍。

2、Get API Demo

1、示例一:

public static void testGet() {

RestHighLevelClient client = EsClient.getClient();

try {

GetRequest request = new GetRequest(“twitter”, “_doc”, “1”);

GetResponse result = client.get(request, RequestOptions.DEFAULT);

System.out.println(result);

} catch(Throwable e) {

e.printStackTrace();

} finally {

EsClient.close(client);

}

}

返回值:

{

“_index”:“twitter”,

“_type”:"_doc",

“_id”:“1”,

“_version”:3,

“found”:true,

“_source”:{

“post_date”:“2009-11-16T14:12:12”,

“message”:“trying out Elasticsearch”,

“user”:“dingw”

}

}

2、示例二:基于getRequest#storeFields进行source字段过滤

public static void testGet_storeFields() {

RestHighLevelClient client = EsClient.getClient();

try {

GetRequest request = new GetRequest(“twitter”, “_doc”, “1”);

request.storedFields(“user”);

GetResponse result = client.get(request, RequestOptions.DEFAULT);

System.out.println(result);

} catch(Throwable e) {

e.printStackTrace();

} finally {

EsClient.close(client);

}

}

返回值:

{

“_index”

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

:“twitter”,

“_type”:"_doc",

“_id”:“1”,

“_version”:3,

“found”:true

}

不符合预期,这是为什么呢?将在下文给出答案。

3、示例三:使用fetchSourceContext进行字段的过滤

public static void testGet_fetchSourceContext() {

RestHighLevelClient client = EsClient.getClient();

try {

GetRequest request = new GetRequest(“twitter”, “_doc”, “1”);

= new String[]{“message”, “*date”};

FetchSourceContext fsc = new FetchSourceContext(true, includes, null);

request.fetchSourceContext(fsc);

GetResponse result = client.get(request, RequestOptions.DEFAULT);

System.out.println(result);

} catch(Throwable e) {

e.printStackTrace();

} finally {

EsClient.close(client);

}

}

返回结果:

{

“_index”:“twitter”,

“_type”:"_doc",

“_id”:“1”,

“_version”:3,

“found”:true,

“_source”:{

“post_date”:“2009-11-16T14:12:12”,

“message”:“trying out Elasticsearch”

}

}

符合预期,只获取_source中的message与以date结尾的属性。

3、Get API 内部工作机制分析

3.1 实时性(Realtime)

默认情况下,get API是实时的,并且不会受到索引刷新频率的影响。如果一个文档被更新了(update),但是还没有刷新,那么get API将会发出一个刷新调用,以使文档可见。这也会使其他文档在上一次刷新可见后发生变化。如果不使用实时获取,可以将realtime=false。

3.2 source字段过滤

按需返回所需字段,例如SQL语句select * 返回所有字段,可以通过select a.id,a.name返回所需字段。

Elasticsearch提供了如下两种方式对_source字段进行过滤:

3.2.1 Stored Fields

get操作允许通过传递storedFields参数来指定一组需要获取储存的字段。如果所请求的字段没有被存储,它们将被忽略。请考虑以下映射:

PUT twitter

{

“mappings”: {

“_doc”: {

“properties”: {

“counter”: {

“type”: “integer”,

“store”: false

},

“tags”: {

“type”: “keyword”,

“store”: true

}

}

}

}

}

注意映射在定义时,store字段,如果设置为false,就算指定storedFields=[“counter”],也不会返回结果,也就时上述【示例2】没有返回 _source的原因。

3.2.2 FetchSourceContext

fetchSourceContext顾名思义,就是fetch source的上下文环境,提供更加完善的过滤逻辑,主要特性为支持include、exclude和支持通篇符过滤。

FetchSourceContext的构造函数:

public FetchSourceContext(boolean fetchSource, String[] includes, String[] excludes) {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值