概述
ES(ElasticSearch)是一个开源的高拓展的分布式全文检索引擎,可以近乎实时地存储,检索数据。
ES使用Java开发,使用Lucence作为基础通过RESTful隐藏Lucence的复杂性。
ELK日志体系
ElasticSearch
LogStash
Kibana
可以认为Solr与ES是竞品关系,Solr是Apache旗下项目,同样使用Java开发。
在建立索引的时候,ES比Solr更快。Solr更适合存量的数据查询。
Solr使用ZK进行分布式管理,ES自身带有分布式协调功能
相关文档
安装 ES安装
9200是后端发送请求restAPI使用的、9300是es在分布式集群下节点间的通信端口
1 docker run --net=host --name elasticsearch -d -e ES_JAVA_OPTS="-Xms2048m -Xmx4096m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0
访问http://localhost:9200,可以得到ES基础信息
配置允许跨域,否则会出现跨域问题无法连接,xxx has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource
1 2 3 4 5 6 7 8 9 10 docker exec -it elasticsearch /bin/bash vi config/elasticsearch.yml # 末尾添加 http.cors.enabled: true http.cors.allow-origin: "*" # 重启ES docker restart elasticsearch
es的目录解读
config目录存放配置文件
bin目录存放了可执行的程序
设置用户名和密码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 docker exec -it elasticsearch bash vi config/elasticsearch.yml xpack.security.enabled: true xpack.license.self_generated.type: basic xpack.security.transport.ssl.enabled: true restart... docker exec -it elasticsearch bash # 交互方式设置密码,需要设置多个用户的密码,设置密码建议不要是纯数字,便于后面直接在命令中设置kibana访问ES的账密。 bin/elasticsearch-setup-passwords interactive docker restart elasticsearch docker restart kibana
HEAD安装
用处不大,Elasticsearch设置用户名密码之后,不能再直接使用Elasticsearch head 访问
1 docker run --net=host --name elasticsearch-head -d -p 9100:9100 mobz/elasticsearch-head:5
Kibana安装 1 2 3 4 5 6 7 8 9 10 docker run --net=host --name kibana -d -e ELASTICSEARCH_HOSTS=http://localhost:9200 -e ELASTICSEARCH_USERNAME="elastic" -e ELASTICSEARCH_PASSWORD="elastic123456" -e SERVER_HOST=0.0.0.0 -p 5601:5601 kibana:7.6.2 docker exec -it kibana bash vi /usr/share/kibana/config/kibana.yml # 修改server.host从0改为0.0.0.0,允许远程访问。如果配置为localhost,只能本地访问。 server.host: "0.0.0.0" docker restart kibana
分词器安装 相关说明
1 2 3 4 5 GET _analyze { "analyzer": "ik_smart", "text":"中华人民共和国国歌" }
安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 下载:https://github.com/medcl/elasticsearch-analysis-ik/releases?q=7.7.0&expanded=true docker exec -it elasticsearch bash cd plugins/ mkdir ik && cd ik curl https://mirror.ghproxy.com/https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip -o ik.zip unzip ik.zip rm ik.zip docker restart elasticsearch
核心概念 与关系型数据库对比
ES是面向文档的,其与数据库的对比如下
关系型数据库
ES
database 数据库
indices 索引
table 表
types 即将弃用
rows 行
documents 文档
column 字段
fields
物理设计:ES在后台将多个索引划分为多个分片,分片可以在多个节点中迁移(ES一开始就是集群模式,不过其允许只有一个节点)
逻辑设计:一个索引类型中,包含多个文档,比如说文档1、文档2。通过索引->类型->文档的方式找到具体的文档。
索引
索引就是数据库,索引是映射类型的容器,ES中的一个索引是一个非常大的文档集合。索引存储了映射类型的字段和其它配置,然后他们被存储到了各个分片上。
一个集群至少有一个节点,一个节点就是一个ES进程。
字段类型
mapping 映射
类型分类
字符串 text、keyword(keyword是不可分割的整体)
数值 long、integer、short、byte、double、float、half、float、scaled float
日期类型 date
布尔值 boolean
二进制 binary
文档
集群
一个集群至少有一个节点,一个节点就是一个ES进程。创建一个索引,索引会有5个主分片,每个分片都会有一个副本(复制分片)。
实际上,一个分片就是一个Lucene索引,一个包含倒排索引的文件目录。何为倒排索引?正常索引是通过ID找数据;倒排索引是通过数据找ID。
操作语法
type被弃用,默认可以写为_doc。
使用 type 允许在一个 index 里存储多种类型的数据,这样就可以减少 index 的数量了。在使用时,向每个文档加入 _type
字段,在指定 type 搜索时就会被用于过滤。只有同一个 index 的中的 type 都有类似的映射 (mapping) 时,才应该使用 type。否则,使用多个 type 可能比使用多个 index 消耗的资源更多。不过type,即将被弃用了。
ES的操作都是基于restful风格的API进行操作。
ES整体 查询ES状态
索引操作 查看所有索引
获取索引
创建索引 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 PUT /test2/ { "mappings": { "properties": { "name":{ "type": "text" }, "age":{ "type": "integer" }, "birthday": { "type": "date" } } } }
删除索引
文档操作 创建文档
创建文档(没有则创建,否则更新):PUT 索引名称/类型名称/文档ID
1 2 3 4 5 PUT /test1/type1/1 or /test1/_doc/1 { "name":"leo", "age":28 }
创建文档(随机ID):POST 索引名称/类型名称
1 2 3 4 5 POST /test1/_doc/ { "name":"tomcat", "age":30 }
修改文档:POST 索引名称/类型名称/文档id/_update(推荐,可以修改部分字段)
删除文档:DELETE 索引名称/类型名称/文档id
获取文档:GET 索引名称/类型名称/文档id
查询所有数据:索引名称/类型名称/_search
删除 1 2 # 删除文档 DELETE /test1/type1/1
查询
1 2 3 4 5 # 精确搜索 GET test1/type1/1 # 模糊搜索 GET test1/type1/_search?q=name:leo
复杂查询
GET查询,携带请求体。注意在UI界面中,URL与路径之间不能包含空白行 !
1 2 3 4 5 6 7 8 GET test1/type1/_search { "query":{ "match":{ "name": "tomcat" } } }
分页 1 2 3 4 { "from": 30, "size": 10 }
筛选
_source字段对查询结果进行过滤,只返回指定的字段
1 2 3 4 5 6 7 8 9 GET test1/type1/_search { "query":{ "match":{ "name": "tomcat" }, "_source": ["field1","field2"] } }
排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 GET test1/type1/_search { "query":{ "match":{ "name": "tomcat" }, "sort": [ { "age":{ "order": "desc" } } ] } }
多条件查询
must(and)
should(or)
must_not(not)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 GET test1/type1/_search { "query":{ "bool": { "must": [ { "match": { "name": "jetty" } }, { "match": { "age": 14 } } ] } } }
过滤器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 GET test1/type1/_search { "query":{ "bool": { "must": [ { "match": { "name": "jetty" } } ] }, "filter": { "range": { "age": { "lt": 10 } } } } }
多条件
1 2 3 4 5 6 7 8 GET test1/type1/_search { "query":{ "match":{ "name": "tomcat jetty leo" } } }
精确查询
term 通过倒排索引指定的词条进行精确查找(效率高)
match 会使用分词器解析
1 2 3 4 5 6 7 8 GET test1/_search { "query":{ "term":{ "name": "tomcat" } } }
分词分析 1 2 3 4 5 6 7 8 9 10 11 12 GET _analyze { "analyzer": "standard", "text": "tomcat" } GET _analyze { "analyzer": "keyword", "text": "tomcat" }
高亮查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 GET test1/_search { "query":{ "match":{ "name": "tomcat" } }, "highlight": { "fields": { "name": { } } } }
通过pre_tags
、post_tags
,自定义高亮的标签。
SpringBoot集成
配置依赖
1 2 3 4 5 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>${springboot.version}</version> </dependency>
配置连接属性
1 2 3 4 5 # 配置 spring: elasticsearch: rest: uris: http://172.16.8.2:9200
索引操作
新增索引:CreateIndexRequest
获取索引,判断是否存在,GetIndexRequest
删除索引,DeleteIndexRequest
文档操作
添加文档,IndexRequest
获取文档,GetIndexRequest
更新文档,UpdateRequest
删除文档,DeleteRequest
批量操作,BulkRequest
查询,SearchRequest