1 初识ElasticSearch

倒排索引:将文档进行分词,形成词条和id的对应关系即为反向索引。
(倒排索引:将各个文档中的内容,进行分词,形成词条,然后记录词条和数据的唯一标识(id)的对应关系,形成的产物)
以唐诗为例,所处包含“前”的诗句

正向索引:由《静夜思》–>窗前明月光—>“前”字

反向索引:“前”字–>窗前明月光–>《静夜思》

反向索引的实现就是对诗句进行分词,分成单个的词,由词推据,即为反向索引

ES存储和查询的原理

index(索引):相当于mysql的库

映射:相当于mysql 的表结构

document(文档):相当于mysql的表中的数据

数据库查询存在的问题

  1. 性能低:使用模糊查询,左边有通配符,不会走索引,会全表扫描,性能低
  2. 功能弱:如果以”华为手机“作为条件,查询不出来数据Es使用倒排索引,对title 进行分词

1.1 ES概念详解

ElasticSearch是一个基于Lucene的搜索服务器,是一个分布式、高扩展、高实时的搜索与数据分析引擎

ES是基于RESTful web接口实现的查询

Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎

官网:https://www.elastic.co/

1.2 应用场景

搜索:海量数据的查询

日志数据分析

实时数据分析

1.3 数据同步

如果想实现"mysql"与"elasticSearch"的数据自动同步, 可以使用开源框架"alibaba/canal".

https://github.com/alibaba/canal/

2 ES核心概念

索引(index): 对应数据库中的表

映射(mapping): 表的结构。

文档(document) : 数据库中的一行数据。

类型(type):

\- ES 5.x中一个index可以有多种type。  //那个时候,index相当于数据库,type相当于表
\- ES 6.x中一个index只能有一种type。
\- ES 7.x以后,将逐步移除type这个概念,现在的操作已经不再使用,默认_doc

3 操作ES-脚本

3.1 RESTful风格介绍

在操作ES时,需要使用使用RESTful风格的请求来操作ES。

GET:用来获取资源

POST:用来新建资源(也可以用于更新资源)

PUT:用来更新资源

DELETE:用来删除资源

注意

ES有多种操作工具:

Postman:操作时需要指定完整路径,如添加索引使用: PUT http://ip:端口/索引名称

kibana: 操作时可以使用简化路径。如添加索引使用: PUT /索引名称

3.2 操作索引

添加索引

PUT http://ip:端口/索引名称

查询索引

GET http://ip:端口/索引名称                 #查询单个索引信息
GET http://ip:端口/索引名称1,索引名称2...    #查询多个索引信息
GET http://ip:端口/_all                   #查询所有索引信息在这里插入代码片

删除索引

DELETE http://ip:端口/索引名称

关闭索引

POST http://ip:端口/索引名称/_close

打开索引

 POST http://ip:端口/索引名称/_open

3.3 操作映射

3.3.1 操作语法

添加映射

   PUT /索引名/_mapping{"properties":{"属性名":{"type": "属性类型","analyzer": "分词类型"},"属性名":{"type": "属性类型"}}}

创建索引并添加映射

   PUT /索引名{"mappings": {"properties": {"属性名": {"type": "属性类型"},"属性名": {"type": "属性类型"}}}}

查询索引

GET /索引名/_mapping

添加字段

   PUT /索引名/_mapping{"properties": {"属性名": {"type": "属性类型"}}}# 添加字段指的是“在映射已经添加完成的情况,对映射增加一个字段”

3.3.2 数据类型

简单数据类型

  • 字符串
    text:会分词,不支持聚合
    keyword:不会分词,将全部内容作为一个词条,支持聚合(类似于可以执行sum之类的统计)
  • 数值
  • 布尔:boolean
  • 二进制:binary
  • 范围类型:integer_range, float_range, long_range, double_range, date_range
  • 日期:date

复杂数据类型

  • 数组:[ ] 数组类型的JSON对象
  • 对象:{ } 单个JSON对象

3.4 操作文档

添加文档,指定id

POST /索引名/_doc/id号
{"属性名":"属性值","属性名":属性值,"属性名":"属性值"
}

添加文档,不指定id

   #添加文档,不指定id(系统会随机ID)POST /索引名/_doc/{"属性名":"属性值","属性名":属性值,"属性名":"属性值"}

查询指定文档

GET /索引名/_search/指定ID

查询所有文档

GET /索引名/_search

删除指定id文档

DELETE /索引名/_doc/1

修改文档,指定id

PUT /索引名/_doc/id号
{"属性名":"属性值","属性名":属性值,"属性名":"属性值"
}

4 分词器

4.1 分词器-介绍

分词器的作用是将一串字符串改为“词”的列表,主要用来建立“倒排索引”,方便后续ES查询。

如“大学生活”,可分为:[大、大学、大学生、学、学生、生、生活、活]。

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包

IKAnalyzer是一个基于Maven构建的项目,具有60万字/秒的高速处理能力,支持用户词典扩展定义

下载地址:https://github.com/medcl/elasticsearch-analysis-ik/archive/v7.4.0.zip

4.2 ik分词器使用

IK分词器有两种分词模式:ik_max_word和ik_smart模式。

4.2.1 ik_max_word

会将文本做最细粒度的拆分,比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、冠军。

例如:

   GET /_analyze{"analyzer": "ik_max_word","text": "乒乓球明年总冠军"}

分词器结果:

{"tokens" : [{"token" : "乒乓球","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "乒乓","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 1},{"token" : "球","start_offset" : 2,"end_offset" : 3,"type" : "CN_CHAR","position" : 2},{"token" : "明年","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 3},{"token" : "总冠军","start_offset" : 5,"end_offset" : 8,"type" : "CN_WORD","position" : 4},{"token" : "冠军","start_offset" : 6,"end_offset" : 8,"type" : "CN_WORD","position" : 5}]
}

4.2.2 ik_smart

会做最粗粒度的拆分,比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。

例如:

  GET /_analyze{"analyzer": "ik_smart","text": "乒乓球明年总冠军"}

分词器结果:

  {"tokens" : [{"token" : "乒乓球","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "明年","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 1},{"token" : "总冠军","start_offset" : 5,"end_offset" : 8,"type" : "CN_WORD","position" : 2}]}

4.3 使用IK分词器-查询文档

词条查询:term

     词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配搜索

全文查询:match

       全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集

词条查询:term

# 查询person中,address属性包含"北京昌平"词条的数据。
# 注意:address所拆分出来的词条中,必须包含完整的“北京昌平”词条,则数据才能别查询出来
GET /person/_search
{"query": {"term": {"address": {"value": "北京昌平"}}}
}

全文查询:match

   #IK会先把“北京昌平”进行词条拆分,比如拆为“北京”,“昌平”。#然后分别查询“北京”,“昌平”,然后求并集GET /person/_search{"query": {"match": {"address":"北京昌平"}}}

5 操作ES-JavaAPI

5.1 SpringBoot整合ES

①搭建SpringBoot工程

②引入ElasticSearch相关坐标

   <!--引入es的坐标--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.4.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.4.0</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.4.0</version></dependency>

配置端口信息

spring.elasticsearch.rest.uris=http://192.168.111.132:9200

③ 创建ES实体类

@Document(indexName = "user")  //索引的名
public class User {@Id@Field(type = FieldType.Integer)private Integer id;@Field(type = FieldType.Keyword)private String name;@Field(type = FieldType.Integer)private Integer age;@Field(type = FieldType.Text ,analyzer = "ik_smart")private String address;

5.2.3 索引,操作

@SpringBootTest
class EsIndexTests{@Autowiredprivate ElasticsearchRestTemplate restTemplate;/*** 添加索引*/@Testpublic  void  addIndexTest(){boolean b = restTemplate.indexOps(User.class).create();System.out.println(b);}/*** 删除索引*/@Testpublic  void deleteIndexTest(){boolean delete = restTemplate.indexOps(User.class).delete();System.out.println(delete);}}

5.3 映射操作

@SpringBootTest
public class EsMappingTest {@Autowiredprivate ElasticsearchRestTemplate restTemplate;/*** 添加映射*/@Testpublic  void addMappingTest(){boolean exists = restTemplate.indexOps(User.class).exists();  //判断是否存在索引if (!exists){ //若不存在,则创建索引restTemplate.indexOps(User.class).create();}boolean mapping = restTemplate.indexOps(User.class).putMapping(User.class); //创建映射System.out.println(mapping);}/*** 查询映射*/@Testpublic  void findMappingTest(){Map<String, Object> mapping = restTemplate.indexOps(User.class).getMapping();System.out.println(mapping);}
}

5.4 文档操作

@SpringBootTest
public class EsDocumentTest {@Autowired //映射注入private ElasticsearchRestTemplate restTemplate;/*** 添加文档信息* 若修改,则id 相同,内容不同即可进行内容的覆盖*/@Testpublic void addDocumentTest() {User user1 = new User(1, "石破天", 23, "侠客岛");User user2 = new User(2, "郭靖", 23, "襄阳");User user3 = new User(3, "虚竹", 23, "飘渺峰");User[] us = {user1, user2, user3};Iterable<User> users = restTemplate.save(us);Iterator<User> iterator = users.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}/*** 根据id修改信息* 若修改,则id 相同,内容不同即可进行内容的覆盖*/@Testpublic void updateDocumentTest() {User user = new User(1, "石破天2.0", 23, "侠客岛2.0");restTemplate.save(user);}/*** 查询*/@Testpublic void findDocumentTest() {User user = restTemplate.get("1", User.class);System.out.println(user);}/*** 根据id删除文档信息*/@Testpublic void deleteDocumentTest() {String delete = restTemplate.delete("1", User.class);System.out.println(delete);}
}

ElasticSearch学习总结(一)相关推荐

  1. ElasticSearch学习总结(三):查询总结

    ElasticSearch学习总结(三):查询总结 本文主要对Elasticsearch中查询相关的知识做一个简单的总结,内容主要包括查询的评分机制,查询改写,过滤器,以及对常见的查询做一个简单的分类 ...

  2. Elasticsearch 学习(二).实战使用

    Elasticsearch 学习(二).实战使用 参考:http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elastic ...

  3. Elasticsearch学习第二篇--常用的几种搜索方式

    Elasticsearch学习第二篇--常用的几种搜索方式 一.Query String Search 查询全部 条件查询 二.Query DSL 查询全部 条件查询 三.Query Filter 四 ...

  4. elasticSearch学习笔记04-同义词,停用词,拼音,高亮,拼写纠错

    由于elasticSearch版本更新频繁,此笔记适用ES版本为 7.10.2 此笔记摘录自<Elasticsearch搜索引擎构建入门与实战>第一版 文中涉及代码适用于kibana开发工 ...

  5. ElasticSearch学习之Kibana(一)

    文章目录 前言 安装elasticsearch elasticsearch基础 定义 基础 安装Kibana 安装 查看服务状态 Kibana索引管理 增加索引(数据库) 获取索引(数据库) 删除索引 ...

  6. Elasticsearch学习(四) - 查询①

    title: Elasticsearch学习(四)-查询① date: 2020-10-29 tags: Elasticsearch Elasticsearch学习(四)-查询① categories ...

  7. Elasticsearch学习-Doc与Segment原理

    Elasticsearch学习-Doc与Segment原理 0x00 系列文章目录 Elasticsearch学习-关于倒排索引.DocValues.FieldData和全局序号 Elasticsea ...

  8. ElasticSearch 学习笔记:Multi Search

    本文目录 1 简介 2 格式 3 header格式 4 body格式 5 返回格式 6 性能 7 相关文章 1 简介 批量查询接口(Multi Search API)允许在一次请求中执行多个查询操作, ...

  9. ElasticSearch学习笔记-ngram、中文拼音、简繁体搜索记录

    ElasticSearch版本:elasticsearch-7.3.0 ElasticSearch相关插件安装可以参考: ElasticSearch学习笔记-插件安装记录_人生偌只如初见的博客-CSD ...

  10. ElasticSearch学习笔记记录5【图灵Fox】

    上述代码可以展示动态映射的概念. 学习视频: [2022最新版]ElasticSearch学习教程合集,从ElasticSearch入门到实战几乎包含你需要的所有操作_哔哩哔哩_bilibili

最新文章

  1. 发布本人汉化最后一个CommunityServer的版本,blog名称也改为 Asp.net源码交流中心...
  2. 维秘天使超模美女Romee Strijd性感运动照片
  3. cordova 打包工具
  4. a++浏览器_走进浏览器内部—剖析浏览器是如何工作的(上)
  5. 购物车完善版,客户余额及所购商品保存在文件
  6. GNU ARM汇编伪操作(Directives) 命令集
  7. springboot配置文件_SpringBoot系列干货:配置文件详解
  8. Java中JDBC连接数据库(MySQL)
  9. 交换机putty怎么调试_弱电工程视频监控系统设计、安装、调试、维护全过程讲解...
  10. kotlin-2(IdeaIU-2018.2汉化破解)
  11. 如何下载csdn的文章并保存成pdf格式呢?并实现某个博主的全部博文下载?
  12. UE4添加人物动画之状态机
  13. 网络推广有哪些常见的推广方法?
  14. 【学习笔记】seckill-秒杀项目--(8)页面优化
  15. 招银网络科技算法面试
  16. 【Pygame小游戏】魂斗罗经典BOSS都回来了 准备好再次击败他们了吗?(附源码)
  17. B2B、B2C、C2C、O2O分别是什么
  18. centos英文版下如何安装中文语言包
  19. sharding-jdbc 分库分表的 4种分片策略
  20. 性能调优(一)----Amdahl定律及木桶原理

热门文章

  1. 中国软件:10个人 20年坎坷路
  2. 火了几年的大前端,现在怎么样了?
  3. 电子驱蚊器就是智商税
  4. 2020.9.28--PS--色阶、色阶上色、曲线
  5. TIL:创建Java线程的两种方法
  6. 英雄联盟手游正式上线啦
  7. android apk反编译(获取源码,资源文件等)
  8. 基于破壳漏洞的蠕虫实践
  9. Linux入门-基础指令与相关概念
  10. 解决Required XXX parameter ‘XXX‘ is not present问题