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 textkeyworddatelongdoubleboolean or ip.

     a type which supports the hierarchical nature of JSON such as object or nested.

    or a specialised type like geo_pointgeo_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"
      }
    }
  }
}

热门文章

暂无图片
编程学习 ·

BIO、NIO、AIO基本概念

BIO 采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成后,通过输出流返回应答给客户端,线程销毁。 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须…
暂无图片
编程学习 ·

ClassName(类名)命名

ClassName命名 ClassName的命名应该尽量精短、明确,必须以字母开头命名,且全部字母为小写,单词之间统一使用下划线 “_” 连接。 eg:.nav_top 注意事项 ad、banner、gg、guanggao 等有机会和广告挂勾的字眠不建议直接用来做ClassName,因为有些浏览器插件(Chrome的广告拦截…
暂无图片
编程学习 ·

js实现复制并能保留原格式粘贴

使用textarea能粘贴的时候保留原格式。使用input粘贴的时候格式会丢失。const input = document.createElement(textarea);document.body.appendChild(input);input.value = “复制我呀”;// input.setAttribute(value, "复制我呀");input.select();if (document.ex…
暂无图片
编程学习 ·

scala写入读取本地文件操作

def write(fileName: String)(datas: Array[String]): Unit = {val writer = new PrintWriter(new File(fileName))println("--------数据写入--------")for (s <- datas) { // println(s)writer.write(s + "\n")}writer.close()}/*** 数据读取** …
暂无图片
编程学习 ·

使用python下载文件

使用requestspython 3.71 下载指定文件 import requestsurl = https://images.jjxsw.la/images/mijjxswcom.gif req = requests.get(url) with open(a.swf, wb) as code:code.write(req.content)
暂无图片
编程学习 ·

Obliv-C使用详解

前期说明 Obliv-C是一款GCC包装器,其作者在C语言的基础上对其进行了一定的类C处理,添加了一些规则限制,用于模拟实现混淆电路 Obliv-C不需要手动混淆,只需要调用其中的函数便可实现混淆电路,其不涉及真实硬件电路仿真,即无法导出函数对应的基本元电路(也可能是博主没有成…
暂无图片
编程学习 ·

啥是智慧社区-百度人脸识别

还记得前几年大家常说的看“脸”的时代吗?现如今回家必须得看脸了,人脸识别助力智慧社区管理升级,以前我们只能在电影里看到了,刷脸进出小区,刷脸开锁等在现实中已经实现了,那使用了人脸识别的智慧社区到底是个啥?下面AI人工智能带大家一探究竟。1、人工智能赋予美好生活…
暂无图片
编程学习 ·

opencv画圆与棋盘图

画出的效果如下:代码 import os import cv2 import numpy as npboard_pixel_width=200 ncols=9 nrows=6if __name__=="__main__":image_width=(ncols+1)*board_pixel_widthimage_height=(nrows+1)*board_pixel_widthres=np.zeros((image_height,image_width,1),np.u…
暂无图片
编程学习 ·

Spring学习笔记1——spring文件配置

1.Spring程序开发步骤 1)导入Spring开发的基本包坐标(或者jar包) 2)编写Dao接口和实现类——Bean 3)创建Spring核心配置文件——applicationContext.xml 4)在Spring配置文件中配置xxxDaoImpl 5)使用Spring的API获得Bean实例(创建ApplicationContext对象getBean) 2.Spr…
暂无图片
编程学习 ·

IO流

File类 添加方法:1.创建普通文本文档:boolean flag= file1.createNewFile(); 2.创建文件夹:boolean flag2=file2.mkdir(); 3.同时创建多个文件夹:boolean flag3=file3.mkdirs();public class fileDemo1 {public static void main(String[] args) {try {//不管D盘是否有这个…
暂无图片
编程学习 ·

vc++ GDI+实现以鼠标为中心缩放图片(并且可以拖动)

按以下步骤操作,即可实现。1. 首先创建一个基于对话框的MFC程序,然后把下面两个文件分别保存为.h文件和 .cpp文件//InitGdiplus.h #pragma once#include <GdiPlus.h> using namespace Gdiplus;class CInitGdiplus { public:CInitGdiplus(void);~CInitGdiplus(void);pri…
暂无图片
编程学习 ·

Java设计模式-5.适配器设计模式

在使用监听器的时候,需要定义一个类事件监听器接口,通常接口中有多个方法,而程序中不一定都用到,但又必须重写很繁琐,定义监听器时只要继承适配器,然后重写需要的方法。 适配器原理:适配器就是一个类,实现了监听器接口,所有抽象方法都重写了,但是方法都是空的,只重写…
暂无图片
编程学习 ·

参考nacos写的Registry注册中心

Registry注册中心 github链接:https://github.com/lzj-github/registry 麻烦大家顺便点个star,谢谢啦! 在学习了SpringCloud的各个组件的使用以及研究过相关源码后,为了更好地理解其内部实现原理,模仿了nacos的部分设计思想,自己实现了该注册中心,代码量4000+,代码中有详…
暂无图片
编程学习 ·

Java调起手机电脑摄像头

一、直接上代码 要导入的maven<!-- java调用摄像头 --><!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><vers…
暂无图片
编程学习 ·

苹果CMSV10黑色自适应简约炫酷影视网站模板

苹果CMSV10黑色自适应简约炫酷影视网站模板苹果CMSv10最新原创酷黑渐变特色自适应视频站模板,模板非常简单,安装方法都一样,直接覆盖附件模板,后台设置模板即可,没有其他设置。酷黑渐变特色功能触动封面直接播放视频内容,自适应影视模板原文摘自: 苹果CMSV10黑色自适应简…
暂无图片
编程学习 ·

java核心小知识课堂 (一)【持续更新......】

1、Java 7 语言的特点: 面向对象性 健壮性 跨平台性 2、一个“.java”源文件中可以包括多个类(不是内部类),但是,最多只能有一个类名声明为public,与文件名相同。 3、设置path的目的是什么? 答:目的是为了在控制台的任何文件路径下,都可以调用jbk指定目录下的所有指令…
暂无图片
编程学习 ·

Tcp Wrapper和sudo权限

1、编写脚本/root/bin/checkip.sh,每5分钟检查一次,如果发现通过ssh登录失败 次数超过10次,自动将此远程IP放入Tcp Wrapper的黑名单中予以禁止防问 #! /bin/bashNUM=10 sleeptime=300 file=/etc/hosts.deny while ture;docat /var/log/secure* | grep Failed password | gre…