Elasticsearch之详细基础语法

  • 优化
  • 配置
  • 创建
  • 查询
  • 命令
  • 字段类型
  • 创建
  • 添加数据
  • 修改索引
  • 打开/关闭索引
  • 删除
  • 自定义分词器
  • 查询
  • 命令说明
  • 查询索引Mapping(结构)
  • 查全部 match_all
  • 单条件查询
  • Bool多条件查询
  • 聚合查询 Aggregation


优化

配置

  • 当机器内存小于64G时,遵循通用的原则,50%给ES,50%留给lucene。
  • 当机器内存大于64G时,遵循以下原则:
  • a. 如果主要的使用场景是全文检索, 那么建议给ES Heap分配 4~32G的内存即可;其它内存留给操作系统, 供lucene使用(segments cache), 以提供更快的查询性能。
  • b. 如果主要的使用场景是聚合或排序, 并且大多数是numerics, dates, geo_points 以及not_analyzed的字符类型, 建议分配给ES Heap分配 4~32G的内存即可,其它内存留给操作系统,供lucene使用(doc values cache),提供快速的基于文档的聚类、排序性能。
  • c. 如果使用场景是聚合或排序,并且都是基于analyzed 字符数据,这时需要更多的 heap size, 建议机器上运行多ES实例,每个实例保持不超过50%的ES heap设置(但不超过32G,堆内存设置32G以下时,JVM使用对象指标压缩技巧节省空间),50%以上留给lucene。
  • 禁止swap,一旦允许内存与磁盘的交换,会引起致命的性能问题。 通过: 在elasticsearch.yml 中 bootstrap.memory_lock: true, 以保持JVM锁定内存,保证ES的性能。

创建

  • 不需要分词的字段,统一设置成keyword,降低索引存储大小

查询

  • 尽量使用term、filter等精确查询
  • 尽量不使用聚合查询aggs

命令

-7.x中的type已经过时,默认设置为_doc

所有的命令都为大写

命令

url

解释

PUT

/索引名称/类型名称/文档ID

创建文档(指定文档ID)

POST

/索引名称/索引类型

创建文档(随机文档ID)

POST

/索引名称/类型名称/文档id/_update

修改文档

POST

/索引名称/类型名称/_search

查询数据

DELETE

/索引名称/类型名称/文档id

删除文档/或者索引

GET

/索引名称/类型名称/文档id

查询文档通过文档ID

字段类型

类型

对应类型

说明

字符串

text keyword

text自动分词,keyword全文匹配

整型

byte short integer long

浮点型

float double half_float scaled_float

日期

date

布尔

boolean

二进制

binary

范围

range

数组

array

对象

object

嵌套

nested

ip

ip (IPv4 和 IPv6 地址)

创建

添加数据可以在自动索引生成之后,先查询Mapping,在Mapping的基础上进行修改索引的字段

规范:数据中String不需要进行分词的,type必须设置为keyword

  • settings: 用来设置分片,副本等配置信息(自定义分词器)
  • mappings: 字段映射,类型等
  • properties: 由于type在后续版本中会被Deprecated, 所以无需被type嵌套
POST index_name
{
  "settings": { ... any settings ... },
  "mappings" : {
      "properties" : {
        "field1" : {
          "type" : "keyword"
        },
        "field2" : {
          "type" : "long"
        },
        "field3" : {
          "type" : "text"
        },
        "field4" : {
          "type" : "date"
        },
        "field5" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
}

添加数据

POST index_name/_doc
{
  "name" : "姓名" ,
  "age" : "年龄" ,
  "sex" : "性别" 
}

禁止自动创建索引

可以通过在 config/elasticsearch.yml 的每个节点下添加下面的配置:

action.auto_create_index: false

修改索引

修改副本数量为0

PUT /test-index-users/_settings
{
  "settings": {
    "number_of_replicas": 0
  }
}

打开/关闭索引

  • 关闭索引

一旦索引被关闭,那么这个索引只能显示元数据信息,不能够进行读写操作

POST index_name/_close
  • 打开索引
POST index_name/_open

删除

DELETE index_name

自定义分词器

PUT /es_medias_test2
{
  "settings": {
    "analysis": {
      "analyzer": {
        "comma": {  //自定义分词器名称
          "type": "pattern",
          "pattern": ","
        }
      }
    }
  },
  "mappings": {
    "esmedias": {
      "properties": {
        "mediaTag": {
          "type": "text",
          "analyzer": "comma"
        }
      }
    }
  }
}

自定义分词器

PUT test_index2
{
"settings":{
  "analysis":{
    "analyzer":{
        "symbol_smart":{
            "type":"custom",
            "char_filter":[],
            "tokenizer":"punctuation",
            "filter":[]
        }
    },
    "tokenizer":{
        "punctuation":{
            "type":"pattern",
            "pattern":"[.,!?]"
        }
    },
    "char_filter":{},
    "filter":{}
    }
  }
}

测试分词器

POST test_index2/_analyze
{
   "analyzer": "symbol_smart",
   "text": "心内科,心外科"
}

参考:

https://zhuanlan.zhihu.com/p/43437056

查询

查询语句按照JSON格式映射

命令说明

命令

说明

from, size

分页

match

模糊查询

match_phrase

段落匹配

term

精确查询

terms

多字段精确查询

bool

多条件查询

query

查询

filter

过滤 必须满足 不计入得分

sort

排序

should

任意满足一个

查询索引Mapping(结构)

GET index_name

查全部 match_all

GET index_name/_search
OR
GET index_name/_search
{
  "query": {
    "match_all": {}
  }
}

单条件查询

每次只能有一个查询

  • from size 指定查询条数,类似于sql的分页
  • _source 限制返回的字段 _source
GET /atlas_cloud_logs/_search
{
  "from": 0, 
  "size": 2, 
  "_source": ["字段"],
  "query": {
    "match": {
      "字段": "条件内容"
    }
  }
}

Bool多条件查询

query 上下文的条件是用来给文档打分的,匹配越好 _score 越高;

filter 的条件只产生两种结果:符合与不符合,后者被过滤掉

  • query 查询 计入得分
  • filter 必须满足 不计入得分
  • must 必须
  • should 或者
  • must_not 不等于
  • sort 排序 _score 查询分数
  • minimum_should_match 至少匹配多少should 字段
  • match 模糊查询
  • match_phrase 段落匹配 查询字段中包含查询内容mill
  • range 范围查询
  • gte 大于等于
  • lte 小于等于
  • e 等于
GET index_name/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "fieldName": {
            "gte": 10, 
            "lte": 200
          }
        }
      },
      "match_phrase": { "address": "mill" }
    }
  },
  "sort": [
    { "_score": "asc" }
  ],
  "minimum_should_match": 1
}

聚合查询 Aggregation

GET /atlas_cloud_logs/_search
{
  "size": 0, 
  "query": {
   "match_all": {
   }
  },
  "aggs": {
    "聚合后返回的关键字": {
      "terms": {
        "field": "聚合字段.keyword"
      }
    }
  }
}