关联关系查询
在ES这样的分布式系统中使用SQL风格的关联语句对性能的损耗是非常大的。所以,ES提供了两种支持水平拓展的关联操作。
-
文档可能包含 nested 类型的字段。这些字段用于索引对象数组,其中每个对象都可以作为独立文档进行查询(使用 nested 查询)。
has_child 和 has_parent 查询
-
同一索引之中的文档可以存在父子关系。 has_child 查询会返回子文档匹配的父文档,而 has_parent 查询则会返回父文档匹配的子文档。
Nested查询
查看 Nested Query 。
nestedQuery(
//嵌套文档的路径
"obj1",
//查询中使用的所有字段都必须使用完整路径
boolQuery()
.must(matchQuery("obj1.name", "blue"))
.must(rangeQuery("obj1.count").gt(5)),
//评分模式支持:ScoreMode.Max、ScoreMode.Min、ScoreMode.Total、ScoreMode.Avg 和 ScoreMode.None
ScoreMode.Avg);
HasChild查询
查看 Has Child Query 。
使用 has_child 查询的时候有一点很重要的就是使用 PreBuiltTransportClient 而不是普通的 client。
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300)));
否则父链接模块将不会被加载,并且[TransportClient]中不能使用 has_child 查询。
JoinQueryBuilders.hasChildQuery(
//需要查询的子查询
"blog_tag",
termQuery("tag","something"),
//评分模式支持:ScoreMode.Avg、ScoreMode.Max、ScoreMode.Min、ScoreMode.None 和 ScoreMode.None
ScoreMode.None);
HasParent查询
查看 Has Parent 。
使用 has_child 查询的时候有一点很重要的就是使用 PreBuiltTransportClient 而不是普通的 client。
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300)));
否则父链接模块将不会被加载,并且 TransportClient 中不能使用 has_parent 查询。
JoinQueryBuilders.hasParentQuery(
"blog",
termQuery("tag","something"),
//是否将父文档匹配分数传递给子文档
false);