一、概述。
ElasticSearch是一个基于Lucene的搜索服务器,提供了一个分布式多用户能力的全文搜索引擎,基于Restful Web接口。它是用Java语言开发,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定、可靠、快速,安装使用方便。不仅能对海量规模的数据完成分布式索引和检索,还能提供数据聚合分析。据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,Elastic Search已成为世界第一的搜索引擎应用。
ES是面向文档的。几个核心概念如下:
Index:索引,做名词可以类比关系型数据库中的database,做动词可以理解为往索引中插入文档;
Type:类型(从7.x开始逐渐移除此该概念, 最新版7.3.0已默认移除),可类比于关系型数据库中的Table;
Document:文档,可类比于关系型数据库中的数据;
Mapping:字段,可类比于关系型数据库中的字段;
ES有两种请求方式:
Restful:统一资源定位的一种约束规则,追求简洁性能,uri中不应包含操作。
CURL:命令行工具,以命令的方式执行Http请求。
二、安装。
推荐使用Docker安装运行。以目前最新版本为例,步骤如下:
1、dockers hub地址:https://hub.docker.com/_/elasticsearch
2、建立es专用用户:user add es
3、设置password:passwd es
4、将es用户加入docker用户组:sudo usermod -aG docker es
5、切换到es用户:su es
6、建立es数据目录:mkdir -rp /docker/elasticsearch/data mkdir /docker/elasticsearch/logs
7、将以上两个目录设为所有人所有权限:chmod 777 /docker/elasticsearch/*
8、使用docker启动es:
docker run --name docker-elasticsearch -p 9200:9200 -p 9300:9300 -v /docker/elasticsearch/data:/usr/share/elasticsearch/data -v /docker/elasticsearch/logs:/usr/share/elasticsearch/logs -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e "discovery.type=single-node" -d elasticsearch:7.3.0
9、打开网址:demo.rener.cc:9200测试是否启动成功
--tips:(1) 因为es是所有人都可以访问的,所以为了安全,es默认不能访问本地目录,也就不能绑定本地目录,所以测试环
境中可以通过建立非root用户并设置目录权限的方式解决。
(2)es是通过网络来判断是开发环境还是正式环境的。docker启动默认不是直连,所以是开发环境。
三、安装kibana
docker run -d --name docker-kibana --link docker-elasticsearch:elasticsearch -p 5601:5601 kibana:7.3.0
四、安装IK Analysis 中文分词器
1、GitHub地址:https://github.com/medcl/elasticsearch-analysis-ik
2、按照readme文档安装
3、重启es
4、手动创建Mapping并配置分词器:
PUT /comment
{
"mappings": {
"properties": {
"content":{
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
}
五、常用命令
kibana中Dev Tools中可使用Rest Ful命令操作ES,也比较推荐采用此方式。
0、查看健康状态:GET _cat/health _cat是es本身的数据查看,包含count、nodes等多个查看es运行数据的命令
1、添加索引 PUT /user
2、查看索引 GET /user
3、删除索引 DELETE /user
4、查看全部索引 GET _cat/indices
5、添加文档
PUT /user/_doc/4 //指定ID为4
{
"name":"heihei",
"age":"22",
"sex":"man",
"email":"[email protected]"
}
6、添加文档
POST /user/_doc //自动生成ID
{
"name":"haha",
"age":"22",
"sex":"man",
"email":"[email protected]"
}
7、更新文档:使用PUT再次提交,会重建索引
8、搜索:
(1)简单搜索:GET /user/_search?q=name:zhangsan
(2)获取全部:GET /user/_search
(3)语法查询:
①match
②term:精准匹配,不分词,较适用于数值类型的字段查询
③fuzzy:模糊匹配
④wildcard:可以使用通配符? *
⑤range:范围匹配
⑥filter:过滤器,不计算相关性
示例:
GET /user/_search
{
"query": {
"match": { //match查询会进行分词,同类的还有matchAll:查询所有,matchPrase:短语匹配;match_phrase_prefix:短语前缀匹配
"name": "zhangsan"
}
}
}
(4)复合查询示例:
GET /user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"FIELD": "TEXT"
}
},
{
"term": {
"FIELD": {
"value": "VALUE"
}
}
},
{
"bool": {
"should": [
{
"match": {
"FIELD": "TEXT"
}
}
]
}
}
],
"must_not": [
{
"match": {
"FIELD": "TEXT"
}
}
],
"filter": {
"term": {
"FIELD": "VALUE"
}
}
}
},
"sort": [
{
"FIELD": {
"order": "desc"
}
}
],
"aggs": {
"NAME": {
"AGG_TYPE": {}
}
},
"from": 0,
"size": 20
}
9、聚合:
GET /user/_search
{
"aggs": {
"NAME": {
"AGG_TYPE": {} //avg/sum/min/max等
}
}
}
六、Java客户端
Elastic search客户端有Rest client(又包括RestHighLevelClient和RestLowLevelClient)和Transport client,前者通过Rest接口访问es,后者通过直接向node节点发送请求的方式访问。推荐使用RestHighLevelClient。Spring集成es可以通过Spring的Spring Data Elasticsearch,它是对官方api的封装,Spring boot可以使用spring-boot-starter-data-elasticsearch,提供了更好的封装,Repository中只需继承ElasticsearchRepository接口,即可使用其中封装好的多个类。但是,其更新较慢,至今不支持7.x以上版本的es,且使用的还是Transport client。
未完待续.......