每日一博 | Elasticsearch 索引设置的总结
在使用ES时,我们常见的就是需要生成一个template来定义索引的设置,分词器,Mapping.本文将基于项目经验来总结一些常用的配置。
Index设置
- index.refresh_interval
配置一个刷新时间,将index buffer刷新到os cache的时间间隔,刷新到os cache的数据才可以被索引到,默认是1s.如果对实时性搜索要求不高的地方,可设置时间为30s,提高性能。
- number_of_replicas
对于集群数据节点 >=2 的场景,建议副本至少设置为 1(一主一从,共两个副本), 可以提高集群容错和搜索吞吐量(副本分片可用于查询)。
- index.number_of_shards
主副本的分片数,默认是5个,最大值限制为1024个,这个值是分片数可适当的增加,提高索引的并发性能,但是分片越多,也会导致资源耗费越高,索引要根据访问并发数和ES集群的资源来设置。经验公式:分片数 = 索引大小/分片大小经验值 30GB,官方推荐Shard值在 20-40GB性能最好,日志类:单分片<50GB;搜索类:单分片<20GB。不足100G,可直接设置3-5个分片(结合节点数和扩展性),超过100G则可以按照如上经验公式来规划。
- index.max_result_window
索引能够查询到最大数据量,from+size深分页的最大条数,默认是10000,适当限制这个值可以防止深分页内存占用过多,如果全量导出,需要使用Scroll游标办法。
- index.store.preload
默认情况下,Elasticsearch完全依靠操作系统文件系统缓存来缓存I / O操作.可以设置index.store.preload,以告知操作系统在打开时将热索引文件的内容加载到内存中。默认值为空,即不提前加载索引到内存中,常见的值有["nvd", "dvd", "tim", "doc", "dim"]。对应的norms, doc values, terms dictionaries, postings lists, points,常见的设置为 index.store.preload = ["nvd", "dvd"],即提前加载norms评分信息和doc value数据到内存,便于快速索引。
-
index.sort.field 和 index.sort.order
建立索引的排序字段,写入的时候就按照顺序写入。对于一些具备顺序的字段,可以提前设置,比如时间字段。配置见下
{ "settings" : { "index" : { "sort.field" : "date", // 字段名字 "sort.order" : "desc" // 升序 asc 和降序 desc } } }
Mapping设置
-
动态映射
mapping的通用配置,dynamic_templates配置动态类型转换,将一个类型转换为另一个类型
{ "mappings": { "_doc": { "dynamic_templates": [ { "strings_as_keywords": { "match_mapping_type": "string", "mapping": { "type": "keyword" } } } ], "_source": { "enabled": true }, "properties": { ..... } } } }
-
字段类型
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/mapping.html#_field_datatypes
a simple type like text
, keyword
, date
, long
, double
, boolean
or ip
.
a type which supports the hierarchical nature of JSON such as object
or nested
.
or a specialised type like geo_point
, geo_shape
, or completion
.
-
常见的类型和搜索类型的联系
(1)text 类型作用:分词,将大段的文字根据分词器切分成独立的词或者词组,以便全文检索。
适用于:email 内容、某产品的描述等需要分词全文检索的字段;
不适用:排序或聚合(Significant Terms 聚合例外)
(2)keyword 类型:无需分词、整段完整精确匹配。
适用于:email 地址、住址、状态码、分类 tags。
-
常见的搜索类型使用的字段类型
term 精确匹配
核心功能:不受到分词器的影响,属于完整的精确匹配。
应用场景:精确、精准匹配。
适用类型:keyword。
prefix 前缀匹配
核心功能:前缀匹配。
应用场景:前缀自动补全的业务场景。
适用类型:keyword。
wildcard 模糊匹配
核心功能:匹配具有匹配通配符表达式 keyword 类型的文档。支持的通配符:*,它匹配任何字符序列(包括空字符序列);?,它匹配任何单个字符。
应用 场景:请注意,选型务必要慎重!此查询可能很慢多组关键次的情况下可能会导致宕机,因为它需要遍历多个术语。为了防止非常慢的通配符查询,通配符 不能以任何一个通配符*或?开头。
适用类型:keyword。
match 分词匹配
核心功能:全文检索,分词词项匹配。
应用场景:实际业务中较少使用,原因:匹配范围太宽泛,不够准确。
适用类型:text。
match_phrase 短语匹配
核心功能:match_phrase 查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索; 只保留那些包含 全部 搜索词项,且 位置"position" 与搜索词 项相同的文档。
应用场景:业务开发中 90%+ 的全文检索都会使用 match_phrase 或者 query_string 类型,而不是 match。
适用类型:text。
multi_match 多组匹配
核心功能:match query 针对多字段的升级版本。
应用场景:多字段检索。
适用类型:text。
query_string 类型
核心功能:支持与或非表达式+其他N多配置参数。
应用场景:业务系统需要支持自定义表达式检索。
适用类型:text。
bool 组合匹配
核心功能:多条件组合综合查询。
应用场景:支持多条件组合查询的场景。
适用类型:text 或者 keyword。一个 bool 过滤器由三部分组成:
must ——所有的语句都 必须(must) 匹配,与 AND 等价。
must_not ——所有的语句都 不能(must not) 匹配,与 NOT 等价。
should ——至少有一个语句要匹配,与 OR 等价。
filter——必须匹配,运行在非评分&过滤模式。
range范围搜索类型
适用类型:long,integer,double或者 date
-
properties 字段的参数设置
-
ES 索引template模板参考例子
PUT _template/test_template { "index_patterns": [ "test_index_*", "test_*" ], "settings": { "number_of_shards": 1, "number_of_replicas": 1, "max_result_window": 100000, "refresh_interval": "30s" }, "mappings": { "properties": { "id": { "type": "long" }, "title": { "type": "keyword" }, "content": { "analyzer": "ik_max_word", "type": "text", "fields": { "keyword": { "ignore_above": 256, "type": "keyword" } } }, "available": { "type": "boolean" }, "review": { "type": "nested", "properties": { "nickname": { "type": "text" }, "text": { "type": "text" }, "stars": { "type": "integer" } } }, "publish_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }, "expected_attendees": { "type": "integer_range" }, "ip_addr": { "type": "ip" }, "suggest": { "type": "completion" } } } }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 11 安装外部来源应用需要重启 APP
尽管每次 Android 版本更新都会引入一系列新功能,但谷歌习惯重新打磨或者完全删除某些称手的功能和特性,而目前处于 Developer Preview 4 的 Android 11 也不例外。 正如开发者在问题追踪器上提交的那样,新版 Android 让应用安装 APK 的权限变得不再方便,需要重新启动相关应用才能生效。该行为与强制分区存储(Scoped Storage)有关。 在 Android 10 及以下版本,APK 文件的安装过程相对来说比较简单。当你从浏览器或者其他应用(例如 APKMirror Installer)中安装 APK 文件的时候,会被要求授予安装权限。如果你选择打开该选项,那么使用手势或者点击返回按钮就会跳转回原来的位置,并且会跳出一个对话框询问你是否愿意安装之前选择的 APK。如下方图片所示: 而这个行为在 Android 11 上就会发生改变。正如不满该特性的测试人员在该问题的追踪页面上所反馈的,在用户授予权限之后,虽然安装对话框依然会弹出,但是该应用本身却消失了。 当你重新打开应用程序的时候,你就会发现整个 APP 被重新加载,这就意味着此前输入的内容...
- 下一篇
爬虫风险管理常见问题有哪些?
云栖号快速入门:【点击查看更多云产品快速入门】不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! Anti-Bot功能相关问题 1.Anti-Bot与WAF提供的爬虫流量防护功能有什么区别? WAF的爬虫流量防护功能主要防御一些由脚本程序编写的单IP访问爬虫流量。爬虫风险管理(Anti-Bot)则可以有效防御精心伪装的、模拟真实用户行为的更高级的爬虫流量。 2.Anti-Bot的防护能力如何?是否每次防护都需要安全技术人员介入? 为了解决业务中的各种恶意爬虫风险,Anti-Bot提供不同维度的防护方案。 智能防护:Anti-Bot依托云上大数据算法沉淀的情报和智能算法模型提供防护能力,无需安全技术人员介入,直接通过控制台启用防护即可。 规则防护:为了实现更细粒度的防护效果,Anti-Bot提供灵活的自定义防护规则配置,可能需要安全技术人员协助分析并制定防护规则策略。同时,不同业务接口可能存在一定特殊性,需要安全技术人员进行分析、选择合适的防护策略,避免因业务接口本身不适合特定的人机校验模式而导致误拦截。 安全技术人员推荐的最佳防护策略方案可以在爬虫变异前有效控制...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群