ElasticSearch
简称ES,ES是一个开源的的,它可以近乎;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能。
目录
1 ElasticSearch概述
简称ES,ES是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储检测数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能。
2 ElasticSearch安装
https://www.elastic.co/
2.1 Windows下使用
下载过安装包后解压
目录介绍:
- bin 启动文件
- config 配置文件
文件夹里面的:
log4j2:日志配置文件;
jvm.options:java 虚拟机相关的配置,可设置运行起来需要的内存,默认是1G。
elasticsearch.yml:elasticsearch 的配置文件! 默认 9200 端口! - lib 相关jar包
- logs 日志
- modules 功能模块
- plugins 插件
启动:
访问 localhost:9200
2.2 可视化工具使用-head插件
下载地址:https://github.com/mobz/elasticsearch-head/
解压
文件主目录下打开cmd
执行
npm install
npm run start
连接测试发现,存在跨域问题:配置 es,在 elasticsearch.yml 的最后添加
http.cors.enabled: true
http.cors.allow-origin: "*"
重启 es 服务器,然后再次连接
把 es 当做一个数据库! (可以建立索引(库),文档(库中的数据!))这个 head 就当做数据展示工具!我们后面所有的查询会用到 Kibana。
2.3 了解 ELK
ELK 是 Elasticsearch、Logstash、Kibana 三大开源框架首字母大写简称。市面上也被成为 ElasticStack。其中 Elasticsearch 是一个基于 Lucene、分布式、通过 Restful 方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用 Elasticsearch 作为底层支持框架,可见 Elasticsearch 提供的搜索能力确实强大,市面上很多时候我们简称 Elasticsearch 为 es。Logstash 是 ELK 的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka 等)。Kibana 可以将 elasticsearch 的数据通过友好的页面展示出来,提供实时分析的功能。
市面上很多开发只要提到 ELK 能够一致说出它是一个日志分析架构技术栈总称,但实际上 ELK 不仅仅适用于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非唯一性。
2.4 安装 Kibana
Kibana 是一个针对 Elasticsearch 的开源分析及可视化平台,用来搜索、查看交互存储在 Elasticsearch 索引中的数据。使用 Kibana,可以通过各种图表进行高级数据分析及展示。Kibana 让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示 Elasticsearch 查询动态。设置 Kibana 非常简单。无需编码或者额外的基础架构,几分钟内就可以完成 Kibana 安装并启动 Elasticsearch 索引监测。
https://www.elastic.co/cn/kibana/
下载完毕后,解压。
测试:
访问:http://localhost:5601
汉化:
2.5 ES核心概念
1、索引
2、字段类型(mapping)
3、文档(documents)
ES与关系型数据库的对比:
倒排索引:
elasticsearch 使用的是一种称为倒排索引的结构,采用 Lucene 倒排索作为底层。这种结构适用于快速的全文搜索, 一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。
如果要搜索含有 python 标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快的多。只需要 查看标签这一栏,然后获取相关的文章 ID 即可。完全过滤掉无关的所有数据,提高效率!
2.6 IK分词器插件
什么是 IK 分词器?
分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如 “我爱狂神” 会被分为"我",“爱”,“狂”,“神”,这显然是不符合要求的,所以我们需要安装中文分词器 ik 来解决这个问题。
IK 提供了两个分词算法:ik_smart 和 ik_max_word,其中 ik_smart 为最少切分,ik_max_word 为最细粒度划分!
安装:https://github.com/medcl/elasticsearch-analysis-ik
将下载好的插件解压后放在es的plugins文件夹下。
可在kibana查看不同的分词效果:
某些词可能是自己需要的,比如想要拆分出来 “产党”,这时候就需要自己加。加过之后,当以后每遇到这个词时都会把这个词分在一起!
liu.dic 里面加入了 “产党”,重新启动es
3 Rest 风格
一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
例如用 PUT 创建索引、类型、字段:
在header上查看:
指定每一个字段的类型:
如果自己的文档字段没有指定,那么 es 就会给我们默认配置字段类型!
修改某个数据:
删除索引:
3.1 关于文档的基本操作
1、添加数据
PUT /lmh/user/1
{
"name": "lmh",
"age": 23,
"desc": "一顿操作猛如虎,一看工资2500",
"tags": ["技术宅","温暖","直男"]
}
PUT /lmh/user/2
{
"name": "张三",
"age": 3,
"desc": "法外狂徒",
"tags": ["交友","旅游","渣男"]
}
PUT /lmh/user/3
{
"name": "李四",
"age": 30,
"desc": "逍遥自在",
"tags": ["靓仔","大餐","编程"]
}
2、获取数据
GET lmh/user/1
3、更新数据
POST /lmh/user/1/_update
{
"doc": {
"name": "刘梦豪"
}
}
4、简单搜索
可以根据默认的映射规则,产生基本的查询。
5、复杂操作搜索 select ( 排序,分页,高亮,模糊查询,精准查询)
可通过 _source 来指定要输出的内容。
之后使用 Java 操作 es ,所有的方法和对象就是这里面的 key!
排序:
分页查询:
布尔值查询,用于 and、or、not 等
过滤器filter,用于比较
gt 大于
gte 大于等于
lt 小于
lte 小于等于!
3.2 精确查询
term 查询是直接通过倒排索引指定的词条进程精确查找的!
- term ,直接查询精确的
- match,会使用分词器解析!(先分析文档,然后在通过分析的文档进行查询!)
新建一个数据库
PUT testdb
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"desc": {
"type": "keyword"
}
}
}
}
注意这里的类型,text类型会采取分词器进行解析,而keyword不会被分词解析。
添加数据
PUT testdb/_doc/1
{
"name": "狂神说Java name",
"desc": "狂神说Java desc"
}
PUT testdb/_doc/2
{
"name": "狂神说Java name",
"desc": "狂神说Java desc2"
}
查询数据
GET testdb/_search
{
"query": {
"term": {
"name": "狂"
}
}
}
GET testdb/_search
{
"query": {
"term": {
"desc": "狂神说Java desc"
}
}
}
当根据 name 查 “狂“ 的时候,由于name字段 是被分词器解析的,因此所有name 带 “狂” 的都会被查到
当根据 desc 查 “狂神说Java desc” 只有一条会被查到,因为 desc 字段不会被分词器解析。必须精准匹配才行。
3.3 高亮查询
GET testdb/_search
{
"query": {
"match": {
"name": "狂神"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
4 es集成SpringBoot
4.1 添加依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.2</version>
</dependency>
4.2 编写配置类
@Configuration // 就是xml,里面注入bean
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
return client;
}
}
4.3
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)