Elasticsearch Document Get API详解、原理与示例

“_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”:“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) {

this.fetchSource = fetchSource;

this.includes = includes == null ? Strings.EMPTY_ARRAY : includes;

this.excludes = excludes == null ? Strings.EMPTY_ARRAY : excludes;

}

可以从两个维度includes(包含)、excludes(排除)。还支持带""的通配符,例如includes = ["msg"]表示以msg开头的属性。通配符的解析逻辑:org.elasticsearch.common.regex#simpleMatchToAutomaton

/** Return an {@link Automaton} that matches the given pattern. */

public static Automaton simpleMatchToAutomaton(String pattern) {

List automata = new ArrayList<>();

int previous = 0;

for (int i = pattern.indexOf(‘‘); i != -1; i = pattern.indexOf(’’, i + 1)) {

automata.add(Automata.makeString(pattern.substring(previous, i)));

automata.add(Automata.makeAnyString());

previous = i + 1;

}

automata.add(Automata.makeString(pattern.substring(previous)));

return Operations.concatenate(automata);

}

3.3 路由机制

如果路由字段不是ID,请使用routing属性,更好的转发请求,否则会全部转发到所有的复制组,然后汇聚并返回。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
91)]

[外链图片转存中…(img-dIu1SjqC-1715669832292)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值