简介

Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,能够快速处理 PB 级别(大数据时代)的数据。

ES 的核心 Lucene 是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。是一套用于全文检索和搜寻的开源程式库,由 Apache 软件基金会支持和提供,使用的是一种称为倒排索引的结构,采用Lucene倒排索作为底层,这种结构适用于快速的全文搜索。

Lucene 提供了一个简单强大的接口,能够做全文索引和搜寻。然而 Lucene 非常复杂,想要使用它就需要深入了解检索的相关知识来理解它是如何工作的。

而 ES 使用 java 开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏 Lucene 的复杂性,从而让全文搜索变得简单 。Elasticsearch 用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

Elasticsearch 是面向文档,关系型数据库(Relational DB)和 Elasticsearch客观的对比!一切都是 json!

Relational DB Elasticsearch
数据库(database) 索引(indices)
表(tables) types
行(rows) documents
字段(columns) fields

在 Elasticsearch(集群)中可以包含多个索引(数据库) ,每个索引中可以包含多个类型(表) ,每个类型下又包含多个文档(行),每个文档中又包含多个字段(列)。

Elasticsearch:9200

下载

  1. 进入Elasticsearch 官网,官网地址:https://www.elastic.co/cn/elasticsearch/

  2. 点击下载

  3. 选择系统(以 Windows 为例)

  4. 等待下载完成

  5. 下载完成

安装

  1. 将下载的压缩包进行解压,解压之后即可使用。

  2. 目录结构

    • bin:启动文件

    • config:配置文件

      • log4j2.properties:日志配置文件
      • jvm.options:java 虚拟机相关的配置
      • elasticsearch.yml:Elasticsearch 的配置文件;默认 9200 端口!跨域。
    • jdk:环境

    • lib:相关 JAR 包

    • logs:日志

    • modules:功能模块

    • plugins:插件

启动

  1. 双击 bin 目录下的 elasticsearch.bat 文件。

  2. 等待启动完成

    默认通信地址:127.0.0.1:9300

    默认公开地址:127.0.0.1:9200

  3. 浏览器访问 127.0.0.1:9200

    name:主机名字。

    cluster_name:集群名字,默认为 elasticsearch。

    cluster_uuid:集群 uuid。

    version:版本。、

    tagline:你知道的,为了搜索。

ES Head:9100

可查看 Elasticsearch 中的信息插件。

注:需要安装 node.js 环境

安装

  1. Github 下载地址:https://github.com/mobz/elasticsearch-head

  2. 解压 elasticsearch-head-master.zip 压缩包

  3. 进入 cmd,运行命令

    已经下载的不用再执行第一条命令。

    git clone git://github.com/mobz/elasticsearch-head.git
    cd elasticsearch-head
    npm install
    

启动

  1. cmd 中启动 elasticsearch-head

    运行以下命令。

    npm run start
    

  2. 在 elasticsearch.yml 中配置跨域

    http.cors.enabled: true
    http.cors.allow-origin: "*"
    
  3. 访问 http://localhost:9100/,点击连接,即可显示节点信息。

Kibana:5601

Elasticsearch 的可视化平台,需要先启动 Elasticsearch。

下载

  1. Kibana 官网下载地址:https://www.elastic.co/cn/kibana/

  2. 点击下载 Kibana

  3. 选中对应版本下载即可

  4. 等待下载完成

  5. 下载完毕之后解压即可。解压非常慢。

启动

  1. 双击 bin 目录下的 Kibana.bat 文件

  2. 等待的时间有可能需要几分钟,根据电脑配置而定。

  3. 浏览器访问 http://localhost:5601/

汉化

  1. config 目录下的 kibana.yaml 文件

  2. 重新启动 Kibana,访问 http://localhost:5601/

IK 分词器插件

IK 分词器可以对中文进行一个分词操作的插件。即把一段中文或者别的划分成一个个的关键字,在搜索的时候会将搜索关键词进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词(不使用用IK分词器的情况下)。

IK 分词器默认提供了两个分词算法:(ik_smart 和 ik_max_word),其中 ik_smart 为最少切分,ik_max_word 为最细粒度划分!

下载

  1. 下载:Github 下载地址:https://github.com/medcl/elasticsearch-analysis-ik

    要下载和 Elasticsearch 一样的版本。

  2. 下载完毕之后,放入到 Elasticsearch 的 plugins 目录下即可。

  3. 重启 Elasticsearch,可以看到 ik 插件被加载。

  4. 在 Kibana 中进行测试

    GET _analyze
    {"analyzer": "ik_smart","text": "蜘蛛侠"
    }
    GET _analyze
    {"analyzer": "ik_max_word","text": "蜘蛛侠"
    }
    

自定义词典

在 IK 的 config 的目录中创建自定义文件 my.dic

添加文本,保存退出。

在 IKAnalyzer.cfg.xml 中配置自己的扩展字典。

重启 ES,

访问 Kibana 可以查看 “蜘蛛侠” 被分为一个词。

如果我们需要自定义分词即在 dic 文件中进行配置即可。

Rest 风格说明

Rest 风格是一种软件架构风格,不是一种标准,它只是提供了一组设计原则约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁更有层次更易于实现缓存等机制。

字段数据类型

主要字段类型如下:

  • 字符串类型:text、keyword

    • text:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储;
    • keyword:不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个 UTF-8 类型的字符,可以通过设置 ignore_above 指定自持字符长度,超过给定长度后的数据将不被索引,无法通过 term 精确匹配检索返回结果。
  • 数值型:long、Integer、short、byte、double、float、half float、scaled float

  • 日期类型:date

  • 布尔类型:boolean

  • 二进制类型:binary

注:如果自己的文档字段没有指定,那么es就会给我们默认配置字段类型!

基本命令

method url地址 描述
PUT(创建,修改) localhost:9200/索引名称/类型名称/文档id 创建文档(指定文档id)
POST(创建) localhost:9200/索引名称/类型名称 创建文档(随机文档id)
POST(修改) localhost:9200/索引名称/类型名称/文档id/_update 修改文档
DELETE(删除) localhost:9200/索引名称/类型名称/文档id 删除文档
GET(查询) localhost:9200/索引名称/类型名称/文档id 查询文档通过文档ID
POST(查询) localhost:9200/索引名称/类型名称/文档id/_search 查询所有数据

样例:创建索引

PUT /索引名/~类型名~/文档id
{请求体}
PUT /test1/type1/1
{"name": "蜘蛛侠","age": 21
}

即创建一个索引 test1 ,文档类型名为 type1,文档 id 为 1。

通过 ES Head 查看数据

高亮显示

GET test/user/_search
{"query": {                           //搜索匹配 name 包含"侠""match": {"name": "侠"}},"highlight": {                       //高亮"pre_tags": "<font color='red'>",  //html 前缀"post_tags": "</font>",              //html 后缀"fields": {                          //属性"name": {}}}
}

集成 SpringBoot

官方文档

  1. 点击链接进入官网:https://www.elastic.co/cn/,点击学习下面的文档。

  2. 找到并点击 Elasticsearch Clients

  3. 这里就是官方支持的文档了

测试 API

创建项目和 ES 配置类

  1. 新建 一个SpringBoot 项目,导入 Elasticsearch 和 fastjson 依赖。

  2. 编写 ElasticSearchClientConfig 配置类。

    @Configuration
    public class ElasticSearchClientConfig {//RestHighLevelClient对象@Beanpublic RestHighLevelClient restHighLevelClient(){RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(//集群设置多个new HttpHost("127.0.0.1", 9200, "http")));return client;}
    }
    
  3. 测试类中注入 RestHighLevelClient 对象。

@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;

创建索引

//创建索引
@Test
void createIndex() throws IOException {CreateIndexRequest request = new CreateIndexRequest("spring_test");CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);System.out.println(createIndexResponse);
}

判断索引是否存在

//判断索引是否存在,存在返回 true,不存在 false
@Test
void isExistIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("spring_test");boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists);
}

删除索引

//删除索引,删除成功,response.isAcknowledged()=true,否则为 false
@Test
void deleteIndex() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest("spring_test");AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);System.out.println(response.isAcknowledged());
}

添加文档

//测试添加文档(User 对象)
@Test
void addDoc() throws IOException {//创建对象User user = new User("Jie", 20);//创建请求IndexRequest request = new IndexRequest("spring_test");//创建规则request.id("1");request.timeout(TimeValue.timeValueSeconds(1));//将数据 json 格式放入请求request.source(JSON.toJSONString(user), XContentType.JSON);//客户端发送请求,获取响应的结果IndexResponse response = client.index(request, RequestOptions.DEFAULT);System.out.println(response);System.out.println(response.status());
}

判断文档是否存在

//判断文档是否存在 get /index/doc/1
@Test
void isExistsDoc() throws IOException {//获取 GetRequest 请求,构造重载 index,type,idGetRequest request = new GetRequest("spring_test","1");//不获取返回的 _source 的上下文request.fetchSourceContext(new FetchSourceContext(false));request.storedFields("_none_");boolean exists = client.exists(request, RequestOptions.DEFAULT);System.out.println(exists);
}

获取文档信息

@Test
void getDoc() throws IOException {//获取 GetRequest 请求,构造重载 index,type,idGetRequest request = new GetRequest("spring_test","1");GetResponse response = client.get(request, RequestOptions.DEFAULT);//将文档内容作为字符串输出System.out.println(response.getSourceAsString());//响应信息是与命令是一样的System.out.println(response);
}

更新文档信息

  1. 获取 UpdateRequest 请求
  2. 设置数据,将数据转为 JSON 格式。
  3. 客户端执行请求
//更新文档信息
@Test
void updateDoc() throws IOException {//获取 GetRequest 请求,构造重载 index,type,idUpdateRequest request = new UpdateRequest("spring_test","1");request.timeout("1s");//创建对象User user = new User("I'm Jie", 22);//将对象封装为 JSON 类型request.doc(JSON.toJSONString(user),XContentType.JSON);UpdateResponse response = client.update(request, RequestOptions.DEFAULT);System.out.println(response);System.out.println(response.status());
}

删除文档信息

  1. 获取 DeleteRequest 请求
  2. 客户端执行请求
//删除文档信息
@Test
void delDoc() throws IOException {//获取 GetRequest 请求,构造重载 index,type,idDeleteRequest request = new DeleteRequest("spring_test","1");request.timeout("1s");DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);System.out.println(response);System.out.println(response.status());
}

批量添加文档信息

  1. 获取 BulkRequest 请求
  2. 准备数据
  3. 批处理请求
    • 循环添加请求数据,将数据转为 JSON 格式。
  4. 客户端执行请求
//批量添加文档信息
@Test
void bulkRequest() throws IOException {BulkRequest request = new BulkRequest();request.timeout("10s");//准备数据ArrayList<User> users = new ArrayList<>();users.add(new User("test1",2));users.add(new User("test2",3));users.add(new User("test3",2));users.add(new User("test4",5));users.add(new User("test5",2));//批处理请求for (int i = 0; i < users.size(); i++) {request.add(new IndexRequest("spring_test").id((i+1)+"")  //不设置 id,默认随机 id.source(JSON.toJSONString(users.get(i)),XContentType.JSON));}//提交请求BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);System.out.println(response);System.out.println(response.status());
}

查询信息

  1. 获取 SearchRequest 请求
  2. 构建搜索条件
    • 设置查询条件(通过 SearchSourceBuilder 构造对应的条件)
  3. 客户端执行请求
  4. 解析响应结果
//查询
//SearchRequest 搜索请求
//SearchSourceBuilder 条件构造
//使用 QueryBuilders 创造条件
//HighlightBuilder 构建高亮
//TermQueryBuilder 精确查询
//MatchAllQueryBuilder 匹配所有
@Test
void search() throws IOException {//请求SearchRequest search = new SearchRequest("spring_test");//构建搜索条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();/*查询条件,可以使用 QueryBuilders 工具类实现*/TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("age", 2);sourceBuilder.query(termQueryBuilder);//设置时间sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));search.source(sourceBuilder);SearchResponse response = client.search(search, RequestOptions.DEFAULT);System.out.println(response);System.out.println(JSON.toJSONString(response.getHits()));System.out.println("===============================");for (SearchHit hit : response.getHits().getHits()) {System.out.println(hit.getSourceAsMap());}
}

高亮字段

  1. 获取 SearchRequest 请求
  2. 设置搜索条件
    1. 设置查询条件
    2. 设置高亮
  3. 执行查询
  4. 客户端执行请求
  5. 解析查询结果
    • 将高亮字段替换掉原来的字段(查询出来的高亮字段和源字段不是同一个,所以需要用高亮后的字段替换源字段)
//高亮字段
@Test
void highLight() throws IOException {//请求SearchRequest search = new SearchRequest("spring_test");//构建搜索条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "test1");sourceBuilder.query(termQueryBuilder);sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));//高亮HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("name");                     //设置高亮字段highlightBuilder.requireFieldMatch(false);          //取消多个高亮highlightBuilder.preTags("<font color='red'>");     //前缀highlightBuilder.postTags("</font>");            //后缀sourceBuilder.highlighter(highlightBuilder);//执行搜索search.source(sourceBuilder);SearchResponse response = client.search(search, RequestOptions.DEFAULT);//解析结果ArrayList<Map<String,Object>> list = new ArrayList<>();for (SearchHit hit : response.getHits().getHits()) {Map<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField name = highlightFields.get("name");//获取原理的结果Map<String, Object> sourceAsMap = hit.getSourceAsMap();// 将高亮字段替换掉原来的字段if(name!=null){Text[] texts = name.getFragments();String n_name="";for (Text text : texts) {n_name += text;}sourceAsMap.put("name",n_name);}list.add(sourceAsMap);}
}

学习 Elasticsearch 的相关使用相关推荐

  1. 非常值得收藏的书签栏,程序员学习与设计相关的网站(有附件下载)

    以下网站是我自己收藏学习与设计相关的网站,从程序员大佬手中扒来的,也有自己的这个是我在CSDN上写的第二篇文章,我也不知道写啥,冥思苦想了好长时间,突然想起来我创建这个博客的目的是分享学习和生活的日常 ...

  2. 用postman快速学习ElasticSearch的搜索功能

    前言 ElasticSearch(以下简称ES)是一个基于Lucene构建的开源(open-source),分布式(distributed),RESTful,实时(real-time)的搜索与分析(a ...

  3. 【深度学习】计算机视觉相关技术探索(一)

    [深度学习]计算机视觉相关技术探索(一) 文章目录 1 计算机视觉概述 2 使用机器学习解决图像分类问题 3 Keras和神经网络简介 4 卷积神经网络(CNN),迁移学习 5 对象检测问题 6 yo ...

  4. 程序如何在两个gpu卡上并行运行_深度学习分布式训练相关介绍 - Part 1 多GPU训练...

    本篇文章主要是对深度学习中运用多GPU进行训练的一些基本的知识点进行的一个梳理 文章中的内容都是经过认真地分析,并且尽量做到有所考证 抛砖引玉,希望可以给大家有更多的启发,并能有所收获 介绍 大多数时 ...

  5. Elasticsearch及相关插件的安装

    Elasticsearch及相关插件的安装 1.安装Elasticsearch并启动服务 2.安装第三方插件 2.1.Head插件 是Elasticsearch的一个集群管理工具,可以通过它来查看和搜 ...

  6. 学习Java的相关知识

    工作的原因现在学习Java极其相关的技术,包括JBoss,Struts,JSP,EJB等. 感觉Java的库比较多,但做的真的一般,易用性很差,编程也非常的"片断"性,不像.NET ...

  7. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  8. 零基础带你学习MySQL—字符串相关的函数(十三)

    零基础带你学习MySQL-字符串相关的函数(十三) 一.CHARSET (str)返回子串字符集 二.CONCAT连接子串,将多个列拼接成一列 三.INSTR(string,substring)返回s ...

  9. 学习图神经网络相关内容

    本周学习情况 本周学习任务: 学习图神经网络相关内容 图基本知识(连通分量.度中心性.特征向量中心性.中介中心性.接近中心性.PageRank.HITS)并使用networkx包简单实践. 学习了相关 ...

最新文章

  1. nodejs -- promise的返回
  2. Spring-AOP 引介切面
  3. android java 实体类 object变量 保存_Java中的实体类--Serializable接口、transient 关键字...
  4. [ECharts]echarts/config is not exists
  5. Windows无法安装到这个磁盘 选中的磁盘具有MBR分区表解决方法
  6. 开源中国iOS客户端学习——(七)MBProgressHUD特效
  7. Linux设备驱动模型三 kset
  8. 磁盘阵列(RAID) 级别
  9. OpenCV-图像处理(32、点多边形测试)
  10. 伦敦皇家音乐学院公爵厅混响当前已添加到Altiverb 7软件
  11. C# 在PPT幻灯片中创建图表
  12. 饥荒联机版加入服务器显示无应答,饥荒联机版水中木更新内容汇总 8月13日更新预览[多图]...
  13. 警告: A docBase E:/Tomcat/webapps/Test inside the host appBase has been specified, and will be ignored
  14. 一.机器人概率学笔记_定位
  15. Matlab中Savitzky-Golay filtering(最小二乘平滑滤波)函数sgolayfilt的使用方法
  16. 商品规格常用的规格排列组合算法
  17. 计算机课程和教学计划,计算机教学计划
  18. 几款好用的矢量图库网站
  19. Y05 - 017、猜小埋年龄游戏
  20. 计算机维修中拆机工具有哪些,秒变专业拆机维修达人,这款工具套装你值得拥有...

热门文章

  1. goland本地包import飘红
  2. 第十四章 结构和其他数据形式
  3. avi文件是什么?avi文件格式介绍
  4. 如何评测光源的好坏?
  5. 华硕天选4和联想拯救者r9000p选哪个好
  6. IO、文件、NIO【草案三】
  7. 华为电脑怎么不上鸿蒙,我找不到不喜欢华为鸿蒙操作系统的理由
  8. matlab的peer啥意思,科学网—Matlab读取PEER地震动记录数据库加速度数据函数 - 王德才的博文...
  9. 如何在vue中设置全局方法
  10. 部分适配尼康Z卡口 三阳推出五款大光圈镜头