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

      建立索引的排序字段,写入的时候就按照顺序写入。对于一些具备顺序的字段,可以提前设置,比如时间字段。配置见下

1{ 2 "settings" : { 3 "index" : { 4 "sort.field" : "date", // 字段名字 5 "sort.order" : "desc" // 升序 asc 和降序 desc 6 } 7 } 8}

Mapping设置

  •  动态映射

 mapping的通用配置,dynamic_templates配置动态类型转换,将一个类型转换为另一个类型

1{ 2 "mappings": { 3 "_doc": { 4 "dynamic_templates": [ 5 { 6 "strings_as_keywords": { 7 "match_mapping_type": "string", 8 "mapping": { 9 "type": "keyword" 10 } 11 } 12 } 13 ], 14 "_source": { 15 "enabled": true 16 }, 17 "properties": { 18 ..... 19 } 20 } 21 } 22}
  •  字段类型  

    官方文档: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

  • Mapping 字段的参数设置

                      

          (1)index,倒排索引,not_analyzed,注意是否分词,尽量精简schema字段个数,不会被检索的字段就不要建立倒排。.field("index", "no")

(2)doc_values,正排索引,用于聚合或者排序

(3)norms,analyzed norms存储了多种正则化算子,用于docs的排序评分,如果不需要排序,可以disable norms

(4)index_options,有docs(文档有无), freqs(重复出现的文档评分更高), positions(涵盖了前2种,并且多了位置信息,用于临近查询), offsets(全部,用于高亮)四类

  • 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" } } } }

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

ElasticSearch 索引设置总结 - HelloWorld