初识ElasticSearch
Elasticsearch 简称 ES,是一个开源的 高扩展 的分布式全文检索引擎,它可以近乎实时的存储、检索数据,本身扩展性好,可以扩展到上百台服务器,处理 PB 级别的数据。ES 也使用 Java 开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RestFul API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
Part 1. ES安装
环境说明
操作系统:windows
ES版本:7.9.1
Kibana:7.9.1
ES安装
ES开箱即用,但需要配置跨域,找到config
文件夹下的elasticsearch.yml
,做如下配置即可。
http.cors.enabled: true
http.cors.allow-origin: "*"
找到bin
目录的elasticsearch.bat
,执行即可启动 ES 。
elasticsearch-head安装
- 首先需要确认安装nodejs(下载安装nodejs即可),为了提高效率,采用国内淘宝的
cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
此时输入cnpm -v
,报错:无法加载文件 … ,因为在此系统上禁止运行脚本。有关详细信息…
原因是无法执行脚本,以管理员身份运行 power shell ,输入
set-ExecutionPolicy RemoteSigned
然后再执行cnpm -v
,问题解决。
-
从 github 上克隆
elasticsearch-head
-
到克隆目录下,执行
cmd
,执行以下命令
cnpm install
npm run start
启动成功
kibana安装
-
下载kibana
-
汉化,找到
config
目录下的kebana.yml
,zh-CN
- 启动,找到
bin
目录下kibana.bat
- 访问,端口
5601
Part 2. ES核心概念
- 索引
- 字段类型(mapping)
- 文档
- 分片(倒排索引)
集群、节点、索引(库)、类型(表)、文档(行)、分片、映射
elasticsearch 是面向文档,一切都是json
elasticsearch(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档中又包含多个字段(列)。
物理设计:elasticsearch 在后台把每个索引划分成多个分片,每个分片可以在集群中的不同服务器间迁移。
逻辑设计:一个索引类型中,包含多个文档,比如说文档1,文档2.当我们索引一篇文档时,可以通过这样的一个顺序找到它:索引 -> 类型 -> 文档ID,通过这个组合我们就能索引到某个具体的文档。注意:ID不必是整数,实际上它是个字符串。
文档
elasticsearch 是面向文档的,那么就意味着索引和搜索数据的最小单位是文档,文档有几个中药属性:
- 自我包含,同时包含key:value
- 可以是层次型的,就是一个json对象,fastjson进行自动转换
- 灵活的结构
索引
就是数据库
索引是映射类型的容器,elasticsearch 中的索引是个非常大的文档集合。索引存储了映射类型的字段和其他设置。然后它们被存储到了各个分片上。
物理设计:节点和分片
一个集群至少有一个节点,而一个节点就是一个 elasticsearch 进程,节点可以有多个索引默认的,如果你创建索引,那么索引将会由5个分片(primary shard,又称主分片)构成,每一个主分片会有一个副本(replica shard,又称复制分片)。
主分片和复制分片都不会在同一个节点内,实际上,一个分片是一个 Lucene 索引,一个包含倒排索引的文件目录,倒排索引的结构使得 elasticsearch 在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。
倒排索引
elasticsearch 使用的是一种称为倒排索引的结构,采用 Lucene 倒排索作为底层。这种结构适用于快速的全文搜索,一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。
Part 3. IK分词器
IK提供了两个分词算法:ik_smart 和 ik_max_word ,其中 ik_smart 为最少切分,ik_max_word 为最细粒度划分。
下载
github地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
然后解压到 plugin 目录下,新建的 ik 目录。
重启 ES 和 kibana 。
查看不同的分词器效果
ik_smart,最少切分
ik_max_word,穷尽词库的可能
分词器字典
找到分词器插件的config
目录中的IKAnalyzer.cfg.xml
新建一个自己的字典,例如:kuang.dic
配置到 xml 中:
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">kuang.dic</entry>
重启 ES 。
Part 4. Rest风格说明
一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
基础测试
- 创建一个索引
PUT /索引名/~类型名~/文档id
{
请求体
}
例如:
PUT /test1/type1/1
{
"name": "狂神说",
"age": 3
}
执行:
查看效果:
PUT testdb
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"desc": {
"type": "keyword"
}
}
}
}
PUT testdb/_doc/1
{
"name": "狂神说Java name",
"desc": "狂神说Java name"
}
PUT testdb/_doc/2
{
"name": "狂神说Java name",
"desc": "狂神说Java desc2"
}
POST testdb/_doc/1/_update
{
"doc":{
"desc": "狂神说Java desc"
}
}
注意:keyword 字段不会被分词器解析。