Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。
Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的
接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
REST API:天然的跨平台。
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
官方中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html
二、Docker 安装 Es和Kibana-
拉取镜像文件
# 存储和检索数据 docker pull elasticsearch:7.4.2 # 可视化检索数据 docker pull kibana:7.4.2
-
配置挂载数据文件夹
# 创建配置文件目录 mkdir -p /mydata/elasticsearch/config # 创建数据目录 mkdir -p /mydata/elasticsearch/data # 将/mydata/elasticsearch/文件夹中文件都可读可写 chmod -R 777 /mydata/elasticsearch/ # 配置任意机器可以访问 elasticsearch echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml
-
启动Elasticsearch
docker run --name elasticsearch --restart=always -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2 # -p 9200:9200 -p 9300:9300:向外暴露两个端口,9200用于HTTP REST API请求,9300 ES 在分布式集群状态下 ES 之间的通信端口; # -e "discovery.type=single-node":es 以单节点运行 # -e ES_JAVA_OPTS="-Xms64m -Xmx512m":设置启动占用内存,不设置可能会占用当前系统所有内存 # -v:挂载容器中的配置文件、数据文件、插件数据到本机的文件夹; # -d elasticsearch:7.6.2:指定要启动的镜像 #访问 IP:9200 看到返回的 json 数据说明启动成功。
-
启动可视化Kibana
docker run --name kibana --restart=always -e ELASTICSEARCH_HOSTS=http://192.168.0.11:9200 -p 5601:5601 -d kibana:7.4.2 # -e ELASTICSEARCH_HOSTS=http://192.168.0.11:9200: 这里要设置成自己的虚拟机IP地址 # http://192.168.0.11:5601/
注意:下载ES对应版本的ik分词器
1. ik分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
2. 解压.ZIP—>移动到Es容器内部 plugins 目录下 3. 授权chmod -R 777 ik4. 重启ES 5. 测试分词器
POST _analyze
{
"analyzer": "ik_smart",
"text": "我是中国人"
}
POST _analyze
{
"analyzer": "ik_max_word",
"text": "我是中国人"
}
6.自定义词库(这里需安装nginx)
#修改/usr/share/elasticsearch/plugins/ik/config/中的 IKAnalyzer.cfg.xml vim /mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml #原来的#修改过后的 IK Analyzer 扩展配置 IK Analyzer 扩展配置 http://192.168.1.123/es/fenci.txt
重启ES
四、Docker安装 nginx- 随便启动一个 nginx 实例,只是为了复制出配置
docker run -p 80:80 --name nginx -d nginx:1.10
- 将容器内的配置文件拷贝到当前目录
docker container cp nginx:/etc/nginx .
- 修改文件名称:mv nginx conf 把这个 conf 移动到/mydata/nginx 下
- 终止原容器:docker stop nginx
- 执行命令删除原容器:docker rm nginx
- 创建新的 nginx;执行以下命令
docker run -p 80:80 --name nginx -v /mydata/nginx/html:/usr/share/nginx/html -v /mydata/nginx/logs:/var/log/nginx -v /mydata/nginx/conf:/etc/nginx -d nginx:1.10
- 给 nginx 的 html 下面放的所有资源可以直接访问
vim index.html #写测试文字,例:如下所示五、检索格式 1、检索信息Hello Nginx
GET bank/_search #检索 bank 下所有信息,包括 type 和 docs
GET bank/_search?q=*&sort=account_number:asc #请求参数方式检索
响应结果
took - Elasticsearch 执行搜索的时间(毫秒) time_out - 告诉我们搜索是否超时 _shards - 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片 hits - 搜索结果 hits.total - 搜索结果 hits.hits - 实际的搜索结果数组(默认为前 10 的文档) sort - 结果的排序 key(键)(没有则按 score 排序) score 和 max_score –相关性得分和最高得分(全文检索用)2、_cat
GET /_cat/nodes: #查看所有节点 GET /_cat/health: #查看 es 健康状况 GET /_cat/master: #查看主节点 GET /_cat/indices:#查看所有索引 show databases;3、样本测试数据
https://gitee.com/xlh_blog/common_content/blob/master/es%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE.json
4、插入(导入)测试数据POST bank/account/_bulk #测试数据六、SpringBoot整合
官网:https://www.elastic.co/guide/en/elasticsearch/client/index.html
1、导入依赖
org.elasticsearch.client
elasticsearch-rest-high-level-client
7.4.2
org.elasticsearch
elasticsearch
7.4.2
compile
org.elasticsearch.client
elasticsearch-rest-client
7.4.2
compile
2、编写配置文件
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Bean
RestHighLevelClient client() {
RestClientBuilder builder = RestClient.builder(new HttpHost("192.168.1.123", 9200, "http")); return new RestHighLevelClient(builder);
}
3、测试
@Test
public void searchData() throws IOException {
//1、创建检索请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//1.1、构造检索条件
searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
System.out.println(searchSourceBuilder.toString());
searchRequest.source(searchSourceBuilder);
//2、执行检索
SearchResponse searchResponse = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
//3、分析结果searchResponse
System.out.println(searchResponse.toString());
}
@Test
public void indexData() throws IOException {
IndexRequest indexRequest = new IndexRequest("users");
indexRequest.id("1"); //数据id
//indexRequest.source("username","zhangsan","age",18,"gender","男");
User user = new User();
user.setUserName("zhangsan");
user.setAge(18);
user.setGender("男");
String jsonString = JSON.toJSONString(user);
indexRequest.source(jsonString, XContentType.JSON);//要保存的内容
//执行操作
IndexResponse index = client.index(indexRequest, ElasticSearchConfig.COMMON_OPTIONS);
System.out.println(index);
}
@Data
class User{
private String userName;
private String gender;
private Integer age;
}



