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

热门文章

暂无图片
编程学习 ·

react-native 使用react-native-image-crop-picker上传图片、视频到服务端

博主主要卡在了上传数据这一步情景是这样的:每一次只允许选择一张图片,每次从相册中选择一图片点击右上角确定后,立即发送请求,上传该图片,并且下次再点击时,重复这个动作。(1)点击下图的上传资料(2)点击红框内的按钮(3)选择图片(4)选择完毕的同时,上传图片到服…
暂无图片
编程学习 ·

05 Pandas(2)

# Author:Nimo_Dingimport pandas as pd import numpy as np from pandas import Series,DataFrame# 数据表的合并 df1=DataFrame({name:[ZhangFei,GuanYu,a,b,c],data1:range(5) }) df2=DataFrame({name:[ZhangFei,GuanYu,A,B,c],data2:range(5) }) print(\n1、基于指定列进行…
暂无图片
编程学习 ·

leetcode 718.最长重复子数组

原题 718.最长重复子数组 2020年7月1日 每日一题题解 方法一 暴力法。 /*暴力法 @v7fgg 执行用时:2265 ms, 在所有 Java 提交中击败了5.00%的用户 内存消耗:39.3 MB, 在所有 Java 提交中击败了100.00%的用户 2020年7月1日 8:03 */ class Solution {public int findLength(int…
暂无图片
编程学习 ·

反射 枚举和lambda

1 反射(reflect) 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法. 对于任意 一个对象,都能够调用它的任意方法和属性. 既然能拿到那么,我们就可以修改部分类型信息. 这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. 2 使用场景: 可…
暂无图片
编程学习 ·

异步FIFO学习

这里写自定义目录标题一、概述二、异步FIFO的设计基础2.1 FIFO指针2.2 格雷码的使用2.2.1 二进制码存在的问题2.2.2 格雷码计数器2.3 空满条件的判断三、异步FIFO设计实现3.1 fifo13.2 fifomem3.3 sync_r2w3.4 sync_w2r3.5 rptr_empty3.6 wptr_full 一、概述 在大规模ASIC或FPG…
暂无图片
编程学习 ·

程序员翻车时的 30 种常见反应!

**软件开发工作充满了挑战性。人无完人,对于程序员来说,写出有 bug 的代码是在所难免的。有些人很淡定,也有一些人会感到生气、沮丧、不安或气馁。在修复 bug 的过程中我们都经历了什么?这个值得我们一探究竟。 本文列出了程序员在修复 bug 时可能会说的一些话或者想法。我…
暂无图片
编程学习 ·

MySQL基础(十二):锁机制

文章目录一、锁的概述1、什么是锁?2、锁的分类二、MySQL中的三种锁1、表锁(偏读)(1)表锁的特点(2)表加读锁、写锁的语法(3)读锁特性实验(4)写锁特性实验(3)结论2、行锁(偏写)(1) 由于行锁支持事务,复习老知识(2)建表sql(3)行锁加读锁、写锁语法(4)读锁…
暂无图片
编程学习 ·

POM 标签大全详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"><!--父项目的坐标。…
暂无图片
编程学习 ·

MFC调用winhttp实现简易的HTTP服务器程序

Windows提供的winhttp函数库用来快速实现HTTP协议的应用程序,包括客户端和服务器端。服务器开发一般流程是这样的:1.HttpInitialize 初始化WinHTTP函数库;2.HttpCreateHttpHandle 创建一个HTTP队列句柄,用来接收HTTP请求;3.HttpAddUrl 绑定要监听的URL,写为http://*:80/表…
暂无图片
编程学习 ·

我很喜欢研究这些比较酷的效果

html5捕鱼达人游戏源代码https://www.mk2048.com/demo/demo_target_desc_h0c1221a2j.html原生js html5一款捕鱼达人的手机小游戏源码。使用介绍: hgame.js 提供一个游戏需要的基本类, objproto.js提供一个游戏需要的扩展类, data.js 提供一个游戏需要的各种数据, start.js …
暂无图片
编程学习 ·

LCOF16 快速幂

链接 lcof16 快速幂 描述 实现函数double Power(double base, int exponent),求base的exponent次方。 分析十进制正整数n,二进制表示“bm…b3b2b1” 二进制转十进制,n = 1b1 + 2b2 + 4b3 + … + 2(m-1)bm 所以计算每一个二进制位的幂(x1,x2 ,x4,…),将所有位的幂相乘 利…
暂无图片
编程学习 ·

程序员:Java数据结构与算法——第十六章·算法设计技术详解

Java数据结构与算法-第十六章算法设计16.1引言在求解一个新问题时,通常的思路是寻找当前问题与已解决问题之间的相似之处,从而轻松找到新问题的求解方法。本章将对各种算法按照不同的方法进行分类,然后在随后的3章中分别介绍3个算法设计思想(即贪婪、分治和动态规划)。16.2分…
暂无图片
编程学习 ·

C++Primer5th 第十六章 模板与泛型编程

第十六章 模板与泛型编程16.1 定义模板16.1.1 函数模板实例化函数模板 模板类型参数 非类型模板参数 inline和constexpr的函数模板 编写类型无关的代码 模板编译 模板大多数编译错误在实例化期间报告16.1.2 类模板定义类模板 实例化类模板 类模板的成员函数 类模板成员函数的实…
暂无图片
编程学习 ·

Linux防火墙安装与配置

Linux防火墙安装与配置流程一、iptables构建防火墙应用步骤如下 1、service iptables status 检查是否安装了iptables 2、systemctl stop firewalld 关闭Linux默认防火墙firewalld 3、systemctl mask firewalld 禁用firewalld服务4、y…
暂无图片
编程学习 ·

数据异常解决方法汇总

文章目录Step1:积极与需求方沟通Step2:将问题进行树枝细化,直至最小单元Step 3. 基于最小单元,梳理相关因素,进行猜想验证Step 4. 测算每个因素对结果的“贡献度”碰到实在分析不出原因的数据异常怎么办? 本文转载自公众号:数据分析师成长记录 Step1:积极与需求方沟通 数…
暂无图片
编程学习 ·

String类

String类的subString方法从指定位置截取到字符串结尾 substring (int beginIndex) :返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。 eg:str1.subString(5)//从第6个位置开始截取截取指定范围的内容 substring (int beginIndex, int endIndex) :返回一个子字符…
暂无图片
编程学习 ·

Ubuntu系统分区(待补充)

Ubuntu系统下一个分区工具是gparted。假设一共有60G空间,建议按照以下方式来分区: 分区之前,建议备份一下现有数据防止丢失: sudo su cd / tar -cvpzf /media/sda7/backup.tgz —exclude=/lost+found —exclude=/sys —exclude=/media /
暂无图片
编程学习 ·

ubuntu 安装多个CUDA版本并可以随时切换

CUDA是什么就不介绍了,直接讲怎么实现CUDA多版本的共存和实时切换。1、安装多个版本的CUDA 这里,我们以cuda9-1版本和cuda9-0版本为例(先安装哪个无所谓) 首先,在cuda版本库中选择自己需要的cuda版本。 然后,选择对应的安装包,这里选择runfile类型的安装文件,以便后面…