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

下面我们一一来介绍一下GetRequest的核心属性。

protected String index:索引库,对应关系型数据库的Database。
private String type:类型,对应关系型数据库的表。
private String id:文档ID,对应关系型数据库表中一行的主键ID。
private String routing:路由值。
private String parent:
private String preference:get请求选取执行节点的偏好,倾向性,在下文会详细介绍。
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详解、原理与示例》中详细介绍。

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);
}
}
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);
	}
}

3、示例三:使用fetchSourceContext进行字段的过滤
public static void testGet_fetchSourceContext() {
RestHighLevelClient client = EsClient.getClient();
try {
GetRequest request = new GetRequest(“twitter”, “_doc”, “1”);
String includes[] = 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);
}
}
符合预期,只获取_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参数来指定一组需要获取储存的字段。如果所请求的字段没有被存储,它们将被忽略。请考虑以下映射:
   注意映射在定义时,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
3.3 路由机制
   如果路由字段不是ID,请使用routing属性,更好的转发请求,否则会全部转发到所有的复制组,然后汇聚并返回。

3.4 倾向性(优先级、Preference)
   Preference参数控制get请求对同一个复制组内多个副本的选择,默认情况下,该操作是在碎片副本之间进行随机分配的。一言以蔽之,preference的作用是同一个复制组中的路由规则。
   其可选值:

_primary
操作将只在主分片上执行。
_local
如果可能的话,操作将更倾向于在本地分配的碎片上执行。当请求发到一个Node上,如果该Node上有对应的副本,则在该节点上执行,
不会再将请求转发到其他 节点。
自定义字符串值
同一个自定义值,将会固定使用同一个分片(路由),该值通常会和会话信息绑定在一起,例如用户名,sessionId等,在应用层面对各
分片节点进行分流。

猜你喜欢

转载自blog.csdn.net/qq_41076792/article/details/108255002
今日推荐