资讯详情

ES宝典大全

E S ? 全 名 E l a s t i c S e a r c h , 不 使 用 传 统 数 据 库 D D L 和 D M L 的 S Q L 语 句 , ES - 全名 ElasticSearch,不使用传统数据库DDL和DML的SQL语句, ES?全名ElasticSearch,不使用传统数据库DDL和DML的SQL语句,

各 版 本 内 容 不 同 , 请 搭 配 官 网 更 新 文 档 食 用 , 本 文 以 7.6.2 版 本 为 例 各版内容不同,请配合官网更新文档食用。本文为7.6.2版本为例 各版本内容不同,请搭配官网更新文档食用,本文以7.6.2版本为例

感 谢 各 位 大 佬 的 文 章 相 助 转 载 内 容 过 多 就 不 一 一 标 注 了 。 如 若 不 方 案 , 请 联 系 删 除 谢谢你的文章帮助转载太多的内容不一一标记。如果没有计划,请联系删除 感谢各/span>位大佬的文章相助转载内容过多就不一一标注了。如若不方案,请联系删除

文章目录

环境说明:使用7.6.2版本的ES及配套kibana和对应ik分词器

一、安装/配置 ES(单节点)

(一) 安装

es安装单节点直接放置程序包到指定地点,解压文件即可

(二) 配置(主要介绍配置elasticsearch.yml文件)

二、安装/配置 ES(集群)

集群安装与单节点安装步骤一致,在所有节点上正确完成解压后即可完成安装,单需要对配置进行修改使其成为集群。配置文件为:$ES_HOME/config/elasticsearch.yml`配置即可。配置内容如下:

跨域请求:

#允许跨域让各种可视化工具连接到Es
http.cors.enabled: true
http.cors.allow-origin: "*"

例:

主节点信息:

#集群名称 保持一致
cluster.name: 集群名字
#节点名称 各节点不相同
node.name: 节点名称
#data目录
path.data: 子节点data目录
#日志目录
path.logs: 子节点log目录
network.host: 0.0.0.0
#服务端口
http.port: 主节点服务端口
#是否为master
node.master: true
#master数量
discovery.zen.minimum_master_nodes: 1
node.data: true
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
discovery.zen.ping_timeout: 3s
cluster.initial_master_nodes: node-1
#服务间通信端口
transport.tcp.port: 子节点通信端口
#服务间互相发现地址
discovery.zen.ping.unicast.hosts: ["主节点IP:8012"]

子节点信息:

#集群名称 保持一致
cluster.name: 集群名字
#节点名称 各节点不相同
node.name: 节点名称
#data目录
path.data: 子节点data目录
#日志目录
path.logs: 子节点logs目录
network.host: 0.0.0.0
#服务端口
http.port: 子节点服务端口
#是否为master
node.master: false
#master数量
discovery.zen.minimum_master_nodes: 1
node.data: true
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
discovery.zen.ping_timeout: 3s
cluster.initial_master_nodes: node-3
#服务间通信端口
transport.tcp.port: 主节点通信端口
#服务间互相发现地址
discovery.zen.ping.unicast.hosts: ["子节点IP:9300"]

[参考ES集群搭建 - 黑狗子](https://www.baidu.com/link?url=apf77QC03wJY0ecODB1rz4sRMuVTlsCkqRW2eI7Ocrg9kDddO0MStZT67aByAerfKKM4Q8Fua7yiD2eYxDaMMvuIyAZRyOaeRQVKOWgkXyK&wd=&eqid=e4c49bb4000b8493000000046257cf3b)

[参考ES集群搭建及详解 - Carrie](https://www.cnblogs.com/hanjiali/p/15872060.html)

三、安装/配置可视化软件-Kibana及对应IK分词器

(一) Kibana

安装Kibana步骤于安装ES一样,仅需放置环境中解压即可。

(二) IK分词器

转载整理自:MRCODE-BOOK – ES主要配置解说 及 SRE菜鸟的成长之路 – Elasticsearch08:es-ik添加自定义词库、热更新词库

2.1、安装

IK分词器均为源码内容,因此在需要安装使用到IK时需要对其源码进行打包编译。打包格式为jar包。

各版本源码地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v8.1.2

a. 将 target/releases/elasticsearch-analysis-ik-5.2.0.zip 拷贝到 $ES_HOME/plugins/ik 目录下

b. 在 $ES_HOME/plugins/ik 下对 elasticsearch-analysis-ik-5.2.0.zip 进行解压缩,比如 `elasticsearch-5.2.0\plugins\ik` 该文件夹下就是所有的解压缩内容
c. 重启 es

注:IK分词器需要对应ES对应版本。同版本才能进行安装。

2.2、配置

ik 配置文件地址:elasticsearch-5.2.0/plugins/ik/config 目录下都是存放配置文件, 下面是一些主要配置文件含义:

  • IKAnalyzer.cfg.xml:用来配置自定义词库
  • main.dic:ik 原生内置的中文词库,总共有 27 万多条,只要是这些单词,都会被分在一起
  • quantifier.dic:放了一些单位相关的词
  • suffix.dic:放了一些后缀
  • surname.dic:中国的姓氏
  • stopword.dic:英文停用词
  • IKAnalyzer.cfg.xml 内容如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
	<entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords">custom/ext_stopword.dic</entry>
	<!--用户可以在这里配置远程扩展字典 -->
	<!-- <entry key="remote_ext_dict">words_location</entry> -->
	<!--用户可以在这里配置远程扩展停止词字典-->
	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

ik 原生最重要的两个配置文件

  • main.dic:包含了原生的中文词语,会按照这个里面的词语去分词
  • stopword.dic:包含了英文的停用词。custom/ext_stopword.dic 中包含了中文的一些扩展词

什么是停用词?与其他词相比,功能词没有什么实际含义,比如’the’、‘is’、‘at’、‘which’、'on’等。

2.2.1 配置自定义词库

IKAnalyzer.cfg.xml:ext_dict,custom/mydict.dic 是在配置文件的默认文件,可以追加,也可以自定义

2.2.2、配置动态词库

1:在bigdata04上部署HTTP服务

在这使用tomcat作为Web容器,先下载一个tomcat 8.x版本。tomcat 8.0.52版本下载地址:https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz

2:tomcat的ROOT项目中创建一个自定义词库文件hot.dic

3:通过http://127.0.0.1:8080/hot.dic的方式验证是否能成功获取文档内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict">my.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <entry key="remote_ext_dict">http://bigdata04:8080/hot.dic</entry> 
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry>-->
</properties>

4:修改ES集群中ik插件的IKAnalyzer.cfg.xml配置文件。在key="remote_ext_dict"这个entry中添加hot.dic的远程访问链接http://127.0.0.1:8080/hot.dic,并同步到集群的所有节点中。

四、集群状态

五、节点角色

https://blog.csdn.net/laoyang360/article/details/78290484

参考https://elasticsearch.cn/question/10346

六、API - 基础信息

es相关API文档外链可参考尹正杰作者写的,里面包含

(一) 数据库结构

1.1、 CLUSTER(集群)

集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。

1.2、SHARDS(分片)

es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

1.3、REPLICAS(副本)

es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

1.4、RECOVERY(回滚)

代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

整理自 灰信网-《ELASTICSEARCH高级(SHARDS、高可用集群搭建)》

(二) 基础属性 Meta-Fields(文档元数据参数)

2.1 _all

_all字段是把其它字段拼接在一起的超级字段,所有的字段用空格分开,_all字段会被解析和索引,但是不存储。当你只想返回包含某个关键字的文档但是不明确地搜某个字段的时候就需要使用_all字段。 例子:

PUT table_name/blog/1 
{
  "title":    "Master Java",
  "content":     "learn java",
  "author": "Tom"
}

_all字段包含:[ “Master”, “Java”, “learn”, “Tom” ]

搜索:

GET table_name/_search
{
  "query": {
    "match": {
      "_all": "Java"
    }
  }
}

返回结果:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.39063013,
    "hits": [
      {
        "_index": "table_name",
        "_type": "blog",
        "_id": "1",
        "_score": 0.39063013,
        "_source": {
          "title": "Master Java",
          "content": "learn java",
          "author": "Tom"
        }
      }
    ]
  }
}

使用copy_to自定义_all字段:

PUT myindex
{
  "mappings": {
    "mytype": {
      "properties": {
        "title": {
          "type":    "text",
          "copy_to": "full_content" 
        },
        "content": {
          "type":    "text",
          "copy_to": "full_content" 
        },
        "full_content": {
          "type":    "text"
        }
      }
    }
  }
}

向myindex中插入一条ID为1的数据

PUT myindex/mytype/1
{
  "title": "Master Java",
  "content": "learn Java"
}

查询刚插入的数据中,所有字段中有设置 copy_tofull_content的字段里包含java的值(类型需要在建索引时设置,建成之后不能修改)

GET myindex/_search
{
  "query": {
    "match": {
      "full_content": "java"
    }
  }
}

2.2 _field_names

_field_names字段用来存储文档中的所有非空字段的名字,这个字段常用于exists查询。例子如下:

PUT table_name/_doc/1
{
  "title": "This is a document"
}

PUT table_name/_doc/2?refresh=true
{
  "title": "This is another document",
  "body": "This document has a body"
}

查询:

GET table_name/_search
{
  "query": {
    "terms": {
      "_field_names": [ "body" ] 
    }
  }
}

结果会返回第二条文档,因为第一条文档没有title字段。 同样,可以使用exists查询:

GET table_name/_search
{
    "query": {
        "exists" : { "field" : "body" }
    }
}

2.3 _id

每条被索引的文档都有一个_type和_id字段,_id可以用于term查询、temrs查询、match查询、query_string查询、simple_query_string查询,但是不能用于聚合、脚本和排序。例子如下:

数据内容:

PUT table_name/_doc/1
{
  "text": "Document with ID 1"
}

PUT table_name/_doc/2
{
  "text": "Document with ID 2"
}

查询:

GET table_name/_search
{
  "query": {
    "terms": {
      "_id": [ "1", "2" ] 
    }
  }
}

2.4 _index

多索引查询时,有时候只需要在特地索引名上进行查询,_index字段提供了便利,也就是说可以对索引名进行term查询、terms查询、聚合分析、使用脚本和排序。

_index是一个虚拟字段,不会真的加到Lucene索引中,对_index进行term、terms查询(也包括match、query_string、simple_query_string),但是不支持prefix、wildcard、regexp和fuzzy查询。

举例,2个索引2条文档

PUT index_1/_doc/1
{
  "text": "Document in index 1"
}

PUT index_2/_doc/2
{
  "text": "Document in index 2"
}

对索引名做查询、聚合、排序并使用脚本新增字段:

GET index_1,index_2/_search
{
  "query": {
    "terms": {
      "_index": ["index_1", "index_2"] 
    }
  },
  聚合(orderby)
  "aggs": {
    "indices": {
      "terms": {
        "field": "_index", 
        "size": 10
      }
    }
  },
  排序:
  "sort": [
    {
      "_index": { 
        "order": "asc"
      }
    }
  ],
  "script_fields": {
    "index_name": {
      "script": {
        "lang": "painless",
        "inline": "doc['_index']" 
      }
    }
  }
}

2.4 _meta

忽略

2.5 _parent

_parent用于指定同一索引中文档的父子关系。下面例子中现在mapping中指定文档的父子关系,然后索引父文档,索引子文档时指定父id,最后根据子文档查询父文档。

PUT table_name
{
  "mappings": {
    "my_parent": {},
    "my_child": {
      "_parent": {
        "type": "my_parent" 
      }
    }
  }
}


PUT table_name/my_parent/1 
{
  "text": "This is a parent document"
}

PUT table_name/my_child/2?parent=1 
{
  "text": "This is a child document"
}

PUT table_name/my_child/3?parent=1&refresh=true 
{
  "text": "This is another child document"
}


GET table_name/my_parent/_search
{
  "query": {
    "has_child": { 
      "type": "my_child",
      "query": {
        "match": {
          "text": "child document"
        }
      }
    }
  }
}

2.6 _routing

路由参数,ELasticsearch通过以下公式计算文档应该分到哪个分片上:

shard_num = hash(_routing) % num_primary_shards1

默认的_routing值是文档的_id或者_parent,通过_routing参数可以设置自定义路由。例如,想把user1发布的博客存储到同一个分片上,索引时指定routing参数,查询时在指定路由上查询:

PUT table_name/_doc/1?routing=user1&refresh=true 
{
  "title": "This is a document"
}

GET table_name/_doc/1?routing=user1123456

在查询的时候通过routing参数查询:

GET table_name/_search
{
  "query": {
    "terms": {
      "_routing": [ "user1" ] 
    }
  }
}

GET table_name/_search?routing=user1,user2 
{
  "query": {
    "match": {
      "title": "document"
    }
  }
}

在Mapping中指定routing为必须的:

PUT table_name2
{
  "mappings": {
    "_doc": {
      "_routing": {
        "required": true 
      }
    }
  }
}

PUT table_name2/_doc/1 
{
  "text": "No routing value provided"
}

2.7 _source

存储的文档的原始值。默认_source字段是开启的,也可以关闭:

PUT tweets
{
  "mappings": {
    "tweet": {
      "_source": {
        "enabled": false
      }
    }
  }
}

但是一般情况下不要关闭,除非你不想做一些操作:

  • 使用update、update_by_query、reindex
  • 使用高亮
  • 数据备份、改变mapping、升级索引
  • 通过原始字段debug查询或者聚合

例:

查询table_name中所有数据,但只展示column1和column2两个字段

GET /table_name/_search
{
  "_source": ["column1","column2"],  
  "query": {
    "match_all": {}
  }
}

2.8 _type

每条被索引的文档都有一个_type_ id字段,可以根据_type进行查询、聚合、脚本和排序。例子如下:

PUT table_name/type_1/1
{
  "text": "Document with type 1"
}

PUT table_name/type_2/2?refresh=true
{
  "text": "Document with type 2"
}

GET table_name/_search
{
  "query": {
    "terms": {
      "_type": [ "type_1", "type_2" ] 
    }
  },
  "aggs": {
    "types": {
      "terms": {
        "field": "_type", 
        "size": 10
      }
    }
  },
  "sort": [
    {
      "_type": { 
        "order": "desc"
      }
    }
  ],
  "script_fields": {
    "type": {
      "script": {
        "lang": "painless",
        "inline": "doc['_type']" 
      }
    }
  }
}

2.9 _uid

_uid_type_index的组合。和_type一样,可用于查询、聚合、脚本和排序。例子如下:

PUT table_name/_doc/1
{
  "text": "Document with ID 1"
}

PUT table_name/_doc/2?refresh=true
{
  "text": "Document with ID 2"
}

GET table_name/_search
{
  "query": {
    "terms": {
      "_uid": [ "_doc#1", "_doc#2" ] 
    }
  },
  "aggs": {
    "UIDs": {
      "terms": {
        "field": "_uid", 
        "size": 10
      }
    }
  },
  "sort": [
    {
      "_uid": { 
        "order": "desc"
      }
    }
  ],
  "script_fields": {
    "UID": {
      "script": {
         "lang": "painless",
         "inline": "doc['_uid']" 
      }
    }
  }
}

七、API - 部分语法及样例

crul方式需要调整发送请求类型:POST、DELETE、GET、PUT,食用方式与PostMan一致

crul "http:127.0.0.1:9200/请求?pretty" -H "ContentType:application/json" -d "请求体"

(一) DDL(Data Definition Language statements)

5. X 版 本 后 不 再 支 持 s t r i n g 类 型 的 字 段 创 建 5.X版本后不再支持string类型的字段创建 5.X版本后不再支持string类型的字段创建

6. X 版 本 后 不 支 持 指 定 文 档 类 型 , 仅 可 指 定 i d 6.X版本后不支持指定文档类型,仅可指定id 6.X版本后不支持指定文档类型,仅可指定id

此节中的例子大部分为7.6.2版本中的内容

​ 创建格式

PUT <索引名>
{
	"mapping":{
		"字段1" : {
			"type":"字段类型"
			"字段里其他内容参考Mapping参数"
		}
	},
	# 以下内容非必填
	"setting":{
		"setting 内容参考Setting参数"
	}
}

show tables;

GET /_cat/indices

1、数据类型(Field datatype)

1.1 string类型(5.X版本后不再支持)

ELasticsearch 5.X之后的字段类型不再支持string,由text或keyword取代。均为关键词检索的字段类型,可进行字段全模糊查询检索。官网5.5版本API

测试:

PUT school
{
  "mappings": {
    "_doc":{
    "properties": {
      "sch_id": {
        "type": "string"
      }
     }
    }
  }
}
# 版本6.4
PUT school
{ 
        
  "mappings": { 
        
    "_doc":{ 
        
    "properties": { 
        
      "sch_id": { 
        
        "type": "keyword",
        "index": true
      }
    }
    }
  }
}

结果:

#! Deprecation: The [string] field is deprecated, please use [text] or [keyword] instead on [title]
{ 
        
  "acknowledged": true,
  "shards_acknowledged": true
}

1.2 text类型

当一个字段要被全文检索如Email内容、聊天记录等非结构化数据时,应使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合(termsAggregation除外),具体属性参数参见官网API - Text datatype 。

把full_name字段设为text类型的Mapping如下:

PUT table_name
{
  "mappings": {
      "properties": {
        "column1": {
          "type":  "text"
        }
      }
  }
}

注:该类型在使用term进行精确查询时,会先进行分词,然后添加倒排索引,故无法使用term对分词前的text字符串进行查询(倒排索引中没有完整的字符串)。对于此类具有精确值的字符串字段,可将其type设置为keyword。

1.3 keyword类型

keyword类型适用于索引结构化的字段,即字段需要进行过滤(单字段模糊查询)、排序或者是聚合则需要指定该类型。也可以在其他类型中指定index:true来达到该目的,比如email地址、主机名、状态码和标签。keyword类型的字段只能通过精确值搜索到。

1.4 数字类型

对于数字类型,ELasticsearch支持以下几种:

类型 取值范围
long -263至263-1
integer -231至231-1
short -32,768至32768
byte -128至127
double 64位双精度IEEE 754浮点类型
float 32位单精度IEEE 754浮点类型
half_float 16位半精度IEEE 754浮点类型
scaled_float 缩放类型的的浮点数(比如价格只需要精确到分,price为57.34的字段缩放因子为100,存起来就是5734)

对于float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界是+0.0不会匹配-0.0。

对于数字类型的数据,选择以上数据类型的注意事项:

  1. 在满足需求的情况下,尽可能选择范围小的数据类型。比如,某个字段的取值最大值不会超过100,那么选择byte类型即可。迄今为止吉尼斯记录的人类的年龄的最大值为134岁,对于年龄字段,short足矣。字段的长度越短,索引和搜索的效率越高。
  2. 优先考虑使用带缩放因子的浮点类型。

例子:

PUT table_name
{
  "mappings": {
    "_doc": {
      "properties": {
        "number_of_bytes": {
          "type": "integer"
        },
        "time_in_seconds": {
          "type": "float"
        },
        "price": {
          "type": "scaled_float",
          "scaling_factor": 100
        }
      }
    }
  }
}

1.5 Object类型

JSON天生具有层级关系,文档会包含嵌套的对象:

PUT table_name/_doc/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}

上面的文档中,整体是一个JSON,JSON中包含一个manager,manager又包含一个name。最终,文档会被索引成一平的key-value对:

{
  "region":             "US",
  "manager.age":        30,
  "manager.name.first": "John",
  "manager.name.last":  "Smith"
}

上面文档结构的Mapping如下:

PUT table_name
{
  "mappings": {
    "_doc": { 
      "properties": {
        "region": {
          "type": "keyword"
        },
        "manager": { 
          "properties": {
            "age":  { "type": "integer" },
            "name": { 
              "properties": {
                "first": { "type": "text" },
                "last":  { "type": "text" }
              }
            }
          }
        }
      }
    }
  }
}

1.6 date类型

在ELasticsearch中,日期类型可以是以下几种:

  1. long类型的毫秒数即绝对秒( milliseconds-since-the-epoch)
  2. integer的秒数即时间戳(seconds-since-the-epoch)
  3. 日期格式的字符串

标签: 8012连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司