java es nested,Nested
Nested
嵌套数据类型
nested类型是一种对象类型的特殊版本,它允许索引对象数组,独立地索引每个对象。
如何使对象数组变扁平
内部类对象数组并不以你预料的方式工作。Lucene没有内部对象的概念,所以Elasticsearch将对象层次扁平化,转化成字段名字和值构成的简单列表。比如,以下的文档:
curl -XPUT 'localhost:9200/my_index/my_type/1?pretty' -d'
{
"group" : "fans",
"user" : [ // 1
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}'
user字段作为对象动态添加
在内部被转化成如下格式的文档:
{
"group" : "fans",
"user.first" : [ "alice", "john" ],
"user.last" : [ "smith", "white" ]
}
user.first和 user.last扁平化为多值字段,alice和 white的关联关系丢失了。导致这个文档错误地匹配对 alice和 smith的查询:
curl -XGET 'localhost:9200/my_index/_search?pretty' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Alice" }},
{ "match": { "user.last": "Smith" }}
]
}
}
}'
使用nested字段对应object数组
如果你需要索引对象数组,并且保持数组中每个对象的独立性,你应该使用nested对象类型而不是object类型。nested对象将数组中每个对象作为独立隐藏文档来索引,这意味着每个嵌套对象都可以独立被搜索:
curl -XPUT 'localhost:9200/my_index?pretty' -d'
{
"mappings": {
"my_type": {
"properties": {
"user": {
"type": "nested" // 1
}
}
}
}
}'
curl -XPUT 'localhost:9200/my_index/my_type/1?pretty' -d'
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}'
curl -XGET 'localhost:9200/my_index/_search?pretty' -d'
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Alice" }},
{ "match": { "user.last": "Smith" }} // 2
]
}
}
}
}
}'
curl -XGET 'localhost:9200/my_index/_search?pretty' -d'
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Alice" }},
{ "match": { "user.last": "White" }} // 3
]
}
},
"inner_hits": { // 4
"highlight": {
"fields": {
"user.first": {}
}
}
}
}
}
}'
| 1 | user 字段映射为 nested 类型而不是 objec t类型 |
| 2 | 该查询没有匹配,因为 Alice 和 Smith 不在同一个嵌套类中 |
| 3 | 该查询有匹配,因为 Alice 和 White 在同一个嵌套类中 |
| 4 | inner_hits 可以高亮匹配的嵌套文档 |
嵌套文档可以:
| 1 | 使用nested查询来搜索 |
| 2 | 使用 [nested](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-nested-aggregation.html "Nested Aggregation") 和 reverse_nested聚合来分析 |
| 3 | 使用 nested sorting来排序 |
| 4 | 使用 nested inner hits 来检索和高亮 |
nested字段参数
| 参数 | 说明 |
| dynamic | 新属性是否应动态添加到现有对象。接受 true (默认), false 和 strict。 |
| include_in_all | 为对象中的所有属性设置默认的 include_in_all 值,对象本身没有添加到 _all 字段。 |
| properties | 对象内的字段,可以是任何数据类型,包括对象。可以将新属性添加到现有对象。 |
注意
因为嵌套文档是作为单独的文档被索引的,所以嵌套文档只能被 nested 查询、nested / reverse_nested或者 nested inner hits 访问。 比如,一个 string 字段包含嵌套文档,嵌套文档中 index_options 设置为 offsets 以使用 postings highlighter,这些偏移量在主要的高亮阶段是不可用的。必须通过 nested inner hits 来进行高亮操作。
限制nested字段的数量
索引一个包含 100 个 nested字段的文档实际上就是索引 101 个文档,每个嵌套文档都作为一个独立文档来索引。为了防止过度定义嵌套字段的数量,每个索引可以定义的嵌套字段被限制在 50 个。
java es nested,Nested相关推荐
- java 嵌套类: Nested classes
java 嵌套类: Nested classes 嵌套类分类 静态嵌套类 非静态嵌套类 普通内部类: Common classes 局部内部类: Local classes 匿名内部类: Anonym ...
- Unknown integral data type for ids : java.lang.String; nested exception is org.hibernate.id.Identifi
1.发生的异常内容: org.springframework.orm.hibernate5.HibernateSystemException: Unknown integral data type f ...
- Type definition error: [simple type, class java.time.Instant]; nested exception is com.fasterxml.jac
postman调用接口报错 "type": "https://www.jhipster.tech/problem/problem-with-message", ...
- ES实现nested类型聚合以及子聚合排序
ES实现nested类型聚合以及子聚合排序 ES实现nested类型聚合以及子聚合排序 需求业务说明 品牌近7天销量 品牌近7日销量趋势 指定某个sku日期范围销量趋势和价格趋势 电商商品日销量索引m ...
- Java嵌套类(Nested Classes)总结
Nested Classes定义 在java语言规范里面,嵌套类(Nested Classes)定义是: A nested class is any class whose declaration o ...
- 14.ES 之 nested 详解(2019-05-22)
1.问题引入: 由于在 ES 里新建.删除.更新单个文档都是原子性的,那么将相关实体保存在同一文档里面是有意义的. PUT /blog/_doc/1 { "title":& ...
- 为什么es中nested数据must_not不生效?
文章目录 一.问题描述 二.错误示例 三.正确示例 一.问题描述 在使用ElasticSearch进行查询的时候,发现nested数据在使用must_not时不生效,可以查出所有数据. index中的 ...
- java es 数据批量导入_ElasticSearch—Java批量导入导出
网上找了很多,我的es是2.3.5版本,网上的客户端最少都是5.x版本,所以没有能用的.自己整合了一下 2.3.5版本的. pom文件: org.elasticsearch elasticsearch ...
- java es api jar包_Elasticsearch 搜索服务器 Java API 使用详解
ElasticSearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elasticsearch 是用 Java 开发的, ...
- java es 数据批量导入_elasticsearch批量数据导入和导出
之前使用ES的时候建表Type时有个字段的类型搞错了.以至于用API查询时出错.所以就研究一下ES API做了一下ES批量导出和导入重构了Type 1:Java API批量导出 Settings se ...
最新文章
- 「杂谈」旷视科技新产品监视学生上课不是什么好事儿
- 开源代码却无奈遗弃,濒临奔溃的开源开发者们!
- BPDU tunnel技术简介
- Windows Server 2012 r2 显示计算机图标
- mybatis面试题讲解1
- matlab有限差分一维导热,一维导热方程-有限差分法-matlab实现11.docx
- Java操作HBase 2.0.5:创建表代码示例
- elasticsearch-7.3安装
- android 7调用摄像头,Android调用摄像头拍照(兼容7.0)
- 解放计算给服务带来的压力,第一想到的就是阿里云高性能计算(HPC)
- LG新能源新设首席数字官 首任是英伟达前数据科学家
- java打印杨辉三角_java算法之打印杨辉三角
- 解决公司服务器加入域中不能启动应用系统的问题
- 用ExpandableListView实现好友分组
- hadoop安装教程(一次填完所有的坑)
- 树莓派摄像头,协议相关,人脸、车牌识别
- 江苏开票系统安全接入服务器地址,江苏省增值税发票查询平台网址.doc
- html整体结构,详解HTML的整体结构
- 视频剪切合并器如何分割音频文件
- android 安装APP缓存文件在哪,APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了...