ElasticSearch的nested类型(三)

420 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

近期在工作中需要使用es进行简单的全文检索,所以最近都在边学边做笔记,也会把自己遇到的bug以及如何解决的,一并记录在这里,供大家学习参考。

在Java代码中,对nested类型进行查询,需要使用NestedQuery进行嵌套类型的查询,在实际使用的工程中会涉及到一些参数。因为之前完全没有接触过,通过上网查询学习,记录下来。

参数说明
path路径名,参数字段的树状路径,例如goodDoc.goodName
query嵌套类型字段的子列上的查询,子列上的查询可以是任意Query类型
scoreMode当字段存在多个值时基于哪个值计算分数
getTotalCount是否返回匹配的总行数,默认为false,表示不返回。返回匹配的总行数会影响查询性能
tableName数据表名称
indexName多元索引名称
columnsToGet是否返回所有列,包含returnAll和columns设置。returnAll默认为false,表示不返回所有列,此时可以通过columns指定返回的列;如果未通过columns指定返回的列,则只返回主键列。当设置returnAll为true时,表示返回所有列。

示例:

MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("goodDoc.goodName", searchContent);
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("goodDoc", matchQueryBuilder, ScoreMode.None)

image.png

package org.apache.lucene.search.join;

public enum ScoreMode {
    None,
    Avg,
    Max,
    Total,
    Min;

    private ScoreMode() {
    }
}

parent-child 关系

关联关系,可以为两个完全分开的文档,可以将一种文档类型以一对多的关系关联到另一个上

优点:

1.parent文档的更新不需要重新为子文档重建索引

2.对子文档进行添加,更改,删除操作室不会影响父文档或者其他子文档

3.子文档可以被当做查询请求的结果返回

Elasticsearch 维护了一个父文档和子文档的映射关系,得益于这个映射,父-子文档关联查询操作非常快。但是这个映射也对父-子文档关系有个限制条件:父文档和其所有子文档,都必须要存储在同一个分片中。

parent-child映射
为了建立parent-child关系,需要在索引创建的时候指定父文档

通过 child 找到 parents

has_child 查询可以匹配多个 child 文档,每个都有相应的相关分数。这些分数如何化归为针对 parent 文档的单独分数取决于 score_mode 参数。默认设置是 none,这会忽视 child 分数并给 parents 分配了 1.0 的分值,不过这里也可以使用 avg,min,max 和 sum

通过 parents 找到 child

parent-child 文档本身是独立的,每个可以独立地进行查询。has_child 查询允许我们返回基于在其 children 的数据上 parents 文档,has_parent 查询则是基于 parents 的数据返回 children。
has_children 查询也支持 score_mode,但是仅仅会接受两个设置:none(默认)和 score.