马云演讲中曾经提到:不少时候少听成功专家的话。全部的创业者多花点时间学习别人是怎么失败的,由于成功的缘由有千千万万,失败的缘由就一两个点。html
创业须要关注别人的失败,而开发实战,别人的错误经验、别人的问题也很是有价值。java
开发最懊悔的事莫过于:本身费尽脑汁、花费了很长时间解决了问题,原来别人在社区或者别的地方早已经给出了更优化的方案。node
开发最最懊悔的事莫过于:别人已经给出了方案,可是咱们仍然在黑暗中苦逼的摸索。git
所以,我从2018年4月——至今,每个月都会梳理出了Elasticsearch中文社区的精华干货——简称:Elastic错题本, 问题大多来自Medcl、wood大叔等大牛的精彩回复,结合实战严选的核心问题。github
放在了GitHub上。算法
GitHub地址:github.com/laoyang360/…apache
目的:提早加深认知,少重复走别人的弯路!api
Elastic 的机器学习功能恰好就能作缓存
另外你要注意一下 Lucene 的语法规则:
lucene.apache.org/core/2_9_4/…
a+(D|d) 这里 a 是可选,括号内的必要的。若是要 a 是必要条件,加号要放前面。若是是两个关键字直接是任意知足的关系,通常是用||。另外注意括号的全角和半角。
如:+a +(c||d)
推荐阅读:elasticsearch.cn/question/66…
filter是单个缓存的,不过对于term 类型的filter是否缓存要看版本。
由于term filter开销很小,因此从5.1.1以后再也不作缓存。
filter上下文中的查询是独立被cache的,因此按照你给的例子,应该是三个。 相关的资料
在这里: www.elastic.co/guide/cn/el…
只不过从5.1.1版本之后开始,term query不会被cache了。 其余类型的query,比方说range query,各类geo的query依然会被cache起来。 这点只有在5.1.1的release notes有说起。
【缘由】
PUT _cluster/settings
{
"persistent": {
"logger.cluster.service": "DEBUG"
}
}
复制代码
打开cluster.service的debug,能看到建立、删除索引的日志
低版本地址:www.elastic.co/guide/en/el…
高版本地址;www.elastic.co/guide/en/el…
经过scroll方式查询时,特别注意要设置游标有效时间不能过久, 例如scroll=30min,过时时间越长对应数据保存在ES内存中就越久,ES内存越大。
srcoll查询完后要及时调用clearScroll(scrollId)
来清理对应游标数据。
Limit of total fields [1000] in index [nfvoemspm] has been exceeded
修改settings
{
"index.mapping.total_fields.limit": 2000
}
复制代码
话说真的须要这么多字段放在一块儿吗,能不能从设计上优化一下。
方案1:SpringBoot+Thymeleaf+RestHighLevelClient
方案2:SpringBoot 简单的语句用String.format复杂语句用Freemarker 而后用RestHighLevelClient甚至直接本身包装一个HttpClient 结合ES本身的template使用
git封装参考:github.com/godlockin/s…
问题:今天发现ES 服务器上全部机器的全部数据都消失了。 没有进行过任何操做。 求教有什么缘由能够致使这种结果.无论是正常的非正常的,能给个指教就是好事。
运维同窗抓破头也没找到问题出在哪
【根因】:运维人员经过head插件把相关index删除了,并且是愤世嫉俗通常的所有删掉。 如今我更关心如何作安全策略
推荐阅读:blog.csdn.net/laoyang360/… 你的Elasticsearch在裸奔吗?
【注意事项】 1.是否暴露了公网访问 2.是否有团队/公司里其余人知道地址 3.检查一下数据导入的脚本有没有重启、oom、作过滤… 4.差不差钱,不差钱的买个xpack作安全策略,差钱就内网隔离部署+黑白名单,亡羊补牢犹未晚矣 5.rerun一下数据导入脚本进行数据修复 6.找到缘由了以后无论多妖或者多蠢,都记得回来这里发个帖子,详细的聊聊整个issue的来龙去脉 七、先看一下数据路径里面的数据是否正常; 八、看一下是否开启了通配符数据删除; 九、看一下 ES 日志,从中找是否集群启停过之类的操做 十、确认下磁盘是否是满了,致使的异常或者磁盘路径的问题
经过Kibana观察到 每次强制给某个索引合并段时 都会发现该索引的所占空间会跟随段合并暴涨一倍;
如今问题是这样的;磁盘空间所剩的空间 不足以撑起某个要合并段的索引的体积的两倍大小 那么这个索引是否是就不能合并了 若是仍执行强制合并段 会发生什么?
回复:es的合并,是将要合并的segment读取出来,再写入到新的segment,而后删除老的segment,因此,消耗大量的资源和磁盘空间。 你这样的状况,建议加大磁盘,或者限制索引合并的线程数量,减少每次合并的segment数量。
最近在作日志采集,发现filebeat和winlogbeat采集日志的时候,会有host这个字段,可是是个object字段,es里日志索引host是text类型,想在agent里直接经过参数把host字段,能够作到么?看了下配置,好像没有找到
你能够经过添加 processors 实现字段过滤的功能,例如
processors:
- drop_fields:
when:
condition
fields: ["field1", "field2", ...]
复制代码
具体请参考: www.elastic.co/guide/en/be…
想支持英文的部分搜索,好比 good,搜索oo也能够匹配出来。这就须要 ngram,可是 ngram 使得 index 占用空间10X+增大,有点没法接受。wildcard 搜索效率又实在过低。有什么折中方案么?
你能够试试前缀搜索 good 你分词为 good/ood/od/ 这样使用前缀搜索就能够实现你须要的效果; 同时设置一下 mapping,可进一步加快搜索速度
"index_prefixes": {
"min_chars": 1,
"max_chars": 10
}
复制代码
Logstash 性能调优主要参数
pipeline.workers:
复制代码
设置启动多少个线程执行 fliter 和 output; 当 input 的内容出现堆积而 CPU 使用率还比较充足时,能够考虑增长该参数的大小;
pipeline.batch.size:
复制代码
设置单个工做线程在执行过滤器和输出以前收集的最大事件数,较大的批量大小一般更高效,但会增长内存开销。输出插件会将每一个批处理做为一个输出单元。;
例如,ES 输出会为收到的每一个批次发出批量请求;调整 pipeline.batch.size 可调整发送到 ES 的批量请求(Bulk)的大小;
pipeline.batch.delay:
复制代码
设置 Logstash 管道的延迟时间, 管道批处理延迟是 Logstash 在当前管道工做线程中接收事件后等待新消息的最长时间(以毫秒为单位);
简单来讲,当 pipeline.batch.size 不知足时,会等待 pipeline.batch.delay 设置的时间,超时后便开始执行 filter 和 output 操做。
请根据具体状况,调整 batch.size 或者 works 的数量
想要实现的功能例子以下:
有2个索引: company person 里面都包含goods和price字段 须要查询出来company和persion中当goods字段的值同样时price字段的值不同的数据,目前没有头绪,请问该怎样写呢。
对 goods 字段进行 termsAgg,而后设置其子聚合为对 _index 的 termsAgg 子聚合,并设置 min_doc_count 为 2; 最后设置 _index 的子聚合为 topHits,这样就能够找到你须要的数据。
{
"size": 0,
"query": {
"match_all": {
"boost": 1.0
}
},
"aggregations": {
"goods": {
"terms": {
"field": "goods",
"size": 10000,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [{
"_count": "desc"
}, {
"_key": "asc"
}],
"collect_mode": "breadth_first"
},
"aggregations": {
"index": {
"terms": {
"field": "_index",
"size": 10,
"min_doc_count": 2,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [{
"_count": "desc"
}, {
"_key": "asc"
}]
},
"aggregations": {
"top": {
"top_hits": {
"from": 0,
"size": 100,
"version": false,
"explain": false
}
}
}
}
}
}
}
}
复制代码
首先要理解 search_after 这个功能; 例如你如今须要安装 id 和 time 进行排序; 你获取了第一页的结果后,如今须要获取第二页内容 你须要使用第一页最后一条的 id 和 time,做为 search_after 的参数chuan传递到查询请求中。
下面是样例:
SearchAfterBuilder searchAfterBuilder = new SearchAfterBuilder();
searchAfterBuilder.setSortValues(new Object[]{"上一页的ID", "上一页的时间"});
复制代码
red恢复的时候是从本地加载以前的索引文件,没有从别的地方同步,因此比较快。 yellow恢复成GREEN的时候,很大部分均可能是从主shard同步数据,在6.x以前,一般都会很慢。 6.x以后因为translog机制的变动可能会变快,但这里还要考虑集群在恢复的时候可能会本身作reblance,一样涉及到shard跨节点的搬迁
最近在作系统的搜索功能,在一个索引下建了一些不一样的类型。 页面上的全局搜索功能是要求展现全部类型的数据。
一开始想的是按找类型发起请求,每一个类型一次,只取几条数据。 可是发现查所有类型的时候,虽然单个类型的数据查询已经解析工做只须要几十毫秒,但所有执行完就须要一秒左右了。 因此想要实现只请求一次,查询全部类型的数据,而且每一个类型只取固定数量的数据。 请问java api能实现这样的功能吗?
【实现】
换一种思路,这么实现一下,能知足你的要求。
POST weibo_index/weibo_type,weibo_cm_type/_search
{
"size": 0,
"query": {
"bool": {
"must": {
"match": {
"cont": "北京"
}
}
}
},
"aggs": {
"type_aggs": {
"terms": {
"field": "_type",
"size": 2
},
"aggs": {
"top_hits_aggs": {
"top_hits": {
"size": 5,
"_source": [
"pt",
"url"
]
}
}
}
}
}
}
复制代码
由于咱们公司业务的缘由,咱们须要copy_to字段后,而后作全文检索,那么我想问一下你们,copy_to字段和直接mutil_field哪一种性能更好一些呢?
【参考1】若是只是简单的全文搜索推荐使用 copy_to,性能更佳; 使用 mutil_field 的优势在于每一个字段可用设置不一样的权重,这样更有助于优化搜索结果排名; 此外 copy_to 会比 mutil_field 占用更多一些的存储
【参考2】 若是是全文检索,建议使用copy_to,使用更少的字段,性能会更好一些。若是只是对某个字段单独去作,就基本上没有什么差异。
粉红色是分片relocating阶段正常的颜色变化,稍安勿躁,一会就行了。
粉红色表示分片在从新分配 若是只是临时重启机器,推荐配置分配延迟分配策略:
PUT _all/_settings
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "5m"
}
}
复制代码
【引伸可能缘由】: 好像硬盘出问题了吧。把副本调整下,再调整回来,让他从新分配下。1G应该是秒级恢复的。
使用ES默认的打分规则(TF-IDF),搜索“葡萄糖”时,搜索结果中“纯净葡萄糖(食用葡萄糖)”比全匹配的“葡萄糖”的得分还要高。由于在前者中“葡萄糖”出现过两次。 可是我更想要全匹配的或匹配度更高的,而不关心出现的次数。对我来讲,相比“纯净葡萄糖(食用葡萄糖)”,我但愿“葡萄糖液”得分更好。 由于“葡萄糖液”中关键字占了3/4,即便前者出现两次“葡萄糖”。 我该怎么修改?是修改TF-IDF配置,或者修改打分算法,仍是自定义打分规则?
【回复】
ES 支持关闭词频统计,设置 mapping 便可
PUT /my_index
{
"mappings": {
"doc": {
"properties": {
"text": {
"type": "string",
"index_options": "docs"
}
}
}
}
}
复制代码
将参数 index_options 设置为 docs 能够禁用词频统计及词频位置,这个映射的字段不会计算词的出现次数,对于短语或近似查询也不可用。要求精确查询的 not_analyzed 字符串字段会默认使用该设置。
推荐阅读:blog.csdn.net/paditang/ar…
【问题】单索引当前已经存储1.5亿多文档,3节点5分片1副本,每一个分片20G多。有按期删除老数据,可是预计在删除老数据前,可能最大存储文档达到24亿多。
当前想到的解决方案: 一、根据预估的最大24亿最大文档,对当前资源进行扩容。 可是根据以前的数据计算,应该如何合理分配分片?如何计算须要扩容几个节点知足要求? 二、使用rollover根据条件,索引太大后,写入数据切换至新索引,可是查询数据仍是对所有索引进行查询。 这样多是多索引,每一个索引5分片1副本。
如今疑惑是哪一种方案更合理?我的倾向于方案2,比较扩容也是须要成本。 可是方案2后续索引增长,分片增长后,每次查询是设置查询别名指向全部索引,这样查询性能是否是也会持续降低?
【回复】 这个推荐先在搜索压力小的时段对索引进行一次 ForceMerge,这样会以前已经删除的文档进行真正删除操做; 此外,若是搜索压力大的化,能够多增长一个副本,这样副本也能够分担搜索的压力;
若是但愿多个索引分担压力,可使用别名,别名
能够指定多个索引的某一个索引是能够写入数据的; 搜索的时候是所有索引一块儿搜索.
【铭毅回复】: 针对方案2:结合template+rollover+别名+curator能够解决问题,不存在性能问题。 相反,针对最新数据的索引,反而经过制定日期索引,会缩减检索样本空间,反而效率更高。
【进一步推动阅读】 6.6 版本索引生命管理 elasticsearch.cn/article/635…
自研基于StanfordNLP的ES分词插件 elasticsearch.cn/article/634…