本文已参与「新人创作礼」活动,一起开启掘金创作之路。
近期在工作中需要使用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)
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.