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”:“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属性,更好的转发请求,否则会全部转发到所有的复制组,然后汇聚并返回。

3.4 倾向性(优先级、Preference)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值