使用 man ascii 来查看 ASCII 表。

重磅《Elasticsearch 中国开发者调查报告》探索开发者的现状和未来

活动medcl 发布了置顶文章 • 24 个评论 • 9367 次浏览 • 2019-12-06 21:10 • 来自相关话题

索引管理,一个好的建议(有认识官方的,可以反馈一下)

medcl 回复了问题 • 2 人关注 • 1 个回复 • 242 次浏览 • 2020-03-14 12:06 • 来自相关话题

es索引带科学记数法的double类型报错

回复

soulzhouxu 发起了问题 • 1 人关注 • 0 个回复 • 138 次浏览 • 2020-03-12 22:47 • 来自相关话题

重启es之后,之前创建的template中的mappings变成空了

byx313 回复了问题 • 2 人关注 • 1 个回复 • 164 次浏览 • 2020-03-15 22:37 • 来自相关话题

es7.1更改index的字段类型

yangruideyang 回复了问题 • 3 人关注 • 3 个回复 • 266 次浏览 • 2020-03-13 15:33 • 来自相关话题

关于es集群扩充节点的问题

byx313 回复了问题 • 4 人关注 • 3 个回复 • 259 次浏览 • 2020-03-15 22:47 • 来自相关话题

如何在ES里实现跨索引聚合?

回复

hope_dream 发起了问题 • 1 人关注 • 0 个回复 • 200 次浏览 • 2020-03-11 14:26 • 来自相关话题

目前Java开发工程师,需要掌握哪些知识?

doom 回复了问题 • 4 人关注 • 4 个回复 • 285 次浏览 • 2 天前 • 来自相关话题

ES 错误更新字段【字段类型不匹配】

zqc0512 回复了问题 • 4 人关注 • 3 个回复 • 206 次浏览 • 2020-03-18 09:22 • 来自相关话题

一种处理Elasticsearch对象数组类型的方式

trycatchfinal 发表了文章 • 0 个评论 • 326 次浏览 • 2020-03-10 20:27 • 来自相关话题

目前情况

Elasticsearch中处理对象数组有两种格式array和nested,但这两种都有一定的不足。
以下面的文档为例:
<br /> {<br /> "user": [<br /> {<br /> "first": "John",<br /> "last": "Smith"<br /> },<br /> {<br /> "first": "Alice",<br /> "last": "White"<br /> }<br /> ]<br /> }<br />
如果在mapping中以array存储,那么实际存储为:
<br /> user.first:["John","Alice"]<br /> user.last:["Smith","White"]<br />
如果以must的方式查询user.first:Johnuser.last:White,那么这篇文档也会命中,这不是我们期望的。

如果在mapping中以array存储,Elasticsearch将每个对象视为一个doc,这例子会存储3个doc,会严重影响ES写入和查询的效率。

Flatten格式

我想到的存储方式很简单,就是将对象数组打平保存为一个keyword类型的字符串数组,故起名Flatten格式。
以上面文档为例,数组对象需要转换为下面的格式

<br /> "user.flatten": [<br /> "first:John",<br /> "last:Smith",<br /> "first:John&last:Smith",<br /> "first:Alice",<br /> "last:White",<br /> "first:Alice&last:White"<br /> ]<br /> <br />

这样以must的方式查询user.first:Johnuser.last:White,可以转换为term查询first:John&last:White,并不会命中文档。
同时,这种方式还是保存1个doc,避免了nested的缺点。

对于flatten格式有几点说明

user.flatten数组的大小

如果user对象个数为M,user属性个数为N,那么其数组大小为(2^N-1)*M

对象为空怎么处理

建议以null方式保存,例如:

<br /> {<br /> "first": "John",<br /> "last": null<br /> }<br />
转换后的格式

<br /> [<br /> "first:John",<br /> "last:null",<br /> "first:John&last:null",<br /> ]<br />

保存和查询对于对象属性的处理顺序要保持一致

上述例子都是按first&last顺序存储的,那么以must的方式查询user.first:Johnuser.last:White也要以first:John&last:White方式查询,不能用last:White&first:John

不足

  • 需要自己编码将JSON对象转换为字符串数组
  • 需要自己编码转换查询语句
  • 只支持term查询

Solutions:网站搜索 - Elastic Site Search

回复

liuxg 发起了问题 • 1 人关注 • 0 个回复 • 119 次浏览 • 2020-03-10 14:10 • 来自相关话题

java 调用.startScroll(),为什么无法排序,求解啊

laoyang360 回复了问题 • 2 人关注 • 1 个回复 • 108 次浏览 • 2020-03-12 13:02 • 来自相关话题

$("#tag").val(previous + "," + data);

回复

rlkb63569 发起了问题 • 0 人关注 • 0 个回复 • 102 次浏览 • 2020-03-09 20:06 • 来自相关话题

ES7.X压缩索引体积的方法还有哪些

byx313 回复了问题 • 2 人关注 • 1 个回复 • 169 次浏览 • 2020-03-15 22:59 • 来自相关话题

elasticsearch-plagin 安装ik报错

medcl 回复了问题 • 2 人关注 • 2 个回复 • 155 次浏览 • 2020-03-09 15:30 • 来自相关话题

logstash 写ES 报错【400 Encountered a retryable error. Will Retry with exponential backoff】

回复

juin 回复了问题 • 1 人关注 • 1 个回复 • 179 次浏览 • 2020-03-08 20:21 • 来自相关话题