elasticsearch
声明:原教程视频链接
1、什么是elasticsearch
百度百科:elasticsearch是一个基于lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。elasticsearch是用Java语言开发的,并作为Apache许可条款下的源码发布,是一种流行的企业级搜索引擎。
elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、net、PHP、python、等其他语言都是可用的。根据DB-Engines的排名显示,elasticsearch是最受欢迎的企业搜索引擎,其次是Apache solr,也是基于lucene。
基本概念
2、elasticsearch和solr的区别
solr 简介
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化
Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
solr是基于lucene开发企业级搜索服务器,实际上就是封装了lucene。
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。
elasticsearch和solr的区别
(1)es基本是开箱即用,非常简单。Solr安装略微复杂一丢丢,可关注(solr6.6教程-基础环境搭建(一))
(2)Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能。
(3)Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
(4)Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑
(5)Solr 查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用; ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索. Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
(6)Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而 Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。
3、elasticsearch下载安装
条件:电脑Java环境需Java1.8及以上
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
解压
目录结构及作用
bin #启动文件
config #配置文件
elasticsearch.yml #elasticsearch配置文件,默认9200端口
jvm.options #java虚拟机相关配置
log4j2.properties #日志配置文件
lib #相关jar包
logs #日志输出文件夹
modules #功能模块
plugins #插件
启动:
打开jvm.options配置文件,修改jvm占用内存大小(elasticsearch默认是1G,电脑内存足够大可以忽视)
打开bin目录,点击elasticsearch.bat右键以管理员身份运行
打开浏览器访问:127.0.0.1:9200
3.1、安装可视化界面elasticsearch-head
条件:电脑需安装node.js npm
下载地址:https://github.com/mobz/elasticsearch-head
解压
进入解压后的目录文件,打开命令窗口,安装依赖
启动:
npm run start
访问:localhost:9100
无法连接elasticsearch,产生跨域
解决:
关闭elasticsearch,打开elasticsearch.yml,输入:
http.cors.enabled: true
http.cors.allow-origin: "*"
保存,重新启动elasticsearch
成功连接
4、安装kibana
了解 ELK
ELK是ElasticSearch、Logstash、Kibana三大开源框架首字母大写简称。
ElasticSearch是基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。
Logstash是ELK的重要数据流引擎,用于从不同目标(文件 / 数据存储 / MQ)收集的不同格式数据,经过过滤后支持输出到不同的目的地(文件 / MQ / redis /elesticsearch / kafka等)。
Kibana 可以将elasticsearch的数据通过友好页面战术出来,提供实时分析功能。
市面上很多开发只要提到ELK能够一直说出它说一个日志分析架构技术栈总称,但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据收集和分析的场景,日志分析和收集只是更具有代表性,并非唯一性。
下载地址:https://www.elastic.co/cn/kibana
解压
打开bin文件目录,以管理员身份运行kibana.bat
访问:http://localhost:5601
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2TlxmnES-1615212698824)(C:\Users\黄彬\AppData\Roaming\Typora\typora-user-images\image-20210301164526481.png)]
4.1、使用kibana对elasticsearch进行基本操作
创建一个索引
PUT /索引名/~类型~/id
{
请求体
}
PUT /test2
{
"mappings": { #定义规则
"properties": { #定义属性
"name": {
"type": "text" #属性类型
},
"age": {
"type": "integer"
},
"sex": {
"type": "short"
}
}
}
}
修改文档
POST /test1/type1/1/_update
{
"doc": {
"age": "24"
}
}
注意:索引名称字母必须全部小写,否则会报错。
删除
根据命令实现删除索引还是删除文档
DELETE /test1
获取数据
先创建一些数据
PUT /test2/_doc/1
{
"name": "bin",
"age": "23",
"sex": "1"
}
PUT /test2/_doc/2
{
"name": "haung",
"age": "24",
"sex": "1"
}
PUT /test2/_doc/3
{
"name": "ling",
"age": "23",
"sex": "0"
}
GET /test2/_doc/1
GET /test2/_doc/_search?q=name:bin
5、复杂查询
term、terms查询
term query会去倒排索引中寻找确切的term,它并不知道分词器的存在,这种查询适合keyword、numeric、date等明确值的
term:查询某个字段里含有某个关键词的文档
terms:查询某个字段里含有多个关键词的文档
GET /test2/_doc/search
{
"query": {
"term": {
"name": "bin"
}
}
}
GET /test2/_doc/search
{
"query": {
"terms": {
"name": [
"huang",
"bin"
]
}
}
}
fuzzy实现模糊查询
value:查询的关键字
boost:查询的权值,默认值是1.0
min_similarity:设置匹配的最小相似度,默认值0.5,对于字符串,取值0-1(包括0和1);对于数值,取值可能大于1;对于日期取值为1d,1m等,1d等于1天
prefix_length:指明区分词项的共同前缀长度,默认是0
GET /test2/_doc/_search/
{
"query": {
"fuzzy": {
"name": {
"value": "huan"
}
}
}
}
GET /test2/_doc/_search
{
"query": {
"match": { #匹配属性name包含bin的文档,会使用分词器
"name": "bin"
}
},
"_source": ["name", "sex"], #只显示name和sex属性
"sort": [
{
"age": { #按照age属性实现降序排序查询
"order": "asc"
}
}
],
"from": 0, #从第几开始查询
"size": 1 #查询大小为多少,应用于分页查询
}
GET /test2/_doc/_search
{
"query": {
"bool": { #查询结果返回布尔值
"must": [ #类似MySQL的and,而MySQL中的or相当于这里的should,not相当于must_not
{
"match": {
"name": "huang"
}
},
{
"match": {
"sex": "1"
}
}
],
"filter": { #过滤条件
"range": {
"age": {
"lt": 10 #gt->大于;gte->大于等于;lt->小于;lte->小于等于
}
}
}
}
}
}
6、spring boot集成elasticsearch
创建spring boot项目,加入elasticsearch依赖
更换elasticsearch版本,和服务器一致
<elasticsearch.version>7.6.1</elasticsearch.version>
编写配置类,设置连接条件和注入bean
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")));
return client;
}
}
测试
@Autowired
private RestHighLevelClient restHighLevelClient;
@Test
public void testEs() throws IOException {
//创建索引请求
CreateIndexRequest request = new CreateIndexRequest("test3");
//执行请求
CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
}