• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
自由的代价是孤独丶
博客园    首页    新随笔    联系   管理    订阅  订阅

ElasticSearch入门到筋痛

1. 什么是ES

ES中文网:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html


ES:是一款基于Lucene编写的搜索引擎框架,它提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的Web接口,简化Lucene的复杂性。底层核心是使用倒排索引。

  • Lucene:是一套信息检索工具包。它是Apache下面的产物,使用起来非常复杂。

  • 基于Lucene的常用搜索引擎框架:ES,Solr(和ES一样,操作比ES更复杂,目前主流使用的还是ES)

  • 全文检索:就是能将一段词语进行分词,且将分出来的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配的内容。

  • RESTful风格的Web接口:操作ES很简单,只需要发送一个HTTP请求,根据请求方式的不同,执行相应的功能。


  • 什么是全文检索、分词?
      1. 将存放的数据以一定的方式进行分词,并将分词的内容放在一个单独的分词库中。
      2. 当用户去查询数据时,会将用户的查询关键字进行分词。
      3. 然后去分词库中匹配内容,最终得到数据的id标识。
      4. 根据id标识去存放数据的位置拉取到指定的数据。

  • 什么是正向索引?
    基于文档id创建索引,如我们的mysql。有了索引,查询就快了。但在查找词条时,正向索引就需要需全表扫描查询,找到对应的词条所在的数据,判断是否符合条件。
    image

  • 什么是倒排索引?
    对文档内容进行了分词,对分词后的词条创建索引,有了索引,查询就快了。当在查找词条,会对词条先进行分词,再根据词条找到对应的文档id,快速获得结果。
    image




1.1 为什么要使用ES

在海量数据中执行搜索功能时,MySQL效率太低。且ES支持全文搜索,还可以将关键字以红色字体展示。





1.2 什么是ELK

ELK:ES,Logstash,Kibana三个框架的简称。

Logstash:是用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同的目的地(Mq/Redis/ES/Kafka等)。

Kibana:可以将ES的数据通过有好的页面展示出来,提供实时分析的功能。

市面上说的ELK:是一个日志分析架构技术栈的总称







2. ES,Kibana,IK分词器的安装

2.1 Windows下安装ES:

https://www.cnblogs.com/tinyj/p/10028875.html

文件目录解析:

bin:启动文件
config:配置文件
      log4j2.properties:   日志配置文件
      jvm.options:         java虚拟机的配置
      elasticsearch.yml:   es的配置文件
data:索引数据目录
lib:相关类库Jar包
logs:日志目录
modules:功能模块
plugins:插件

双击ElasticSearch下的bin目录中的elasticsearch.bat启动,控制台显示的日志(等待启动完毕!)

然后在浏览器访问:http://localhost:9200 有信息,说明安装成功了





2.2 Windows下安装Kibana:

https://www.cnblogs.com/aaronthon/p/12178100.html
https://www.cnblogs.com/a438842265/p/12325972.html

Kibana:是一个针对ES的开源分析及可视化平台,用来搜索,查看交互存储在ES索引中的数据。使用它可以通过各种图表进行高级数据分析及展示。

Kibana的操作界面是英文的怎么解决:

Kibana的页面是英文的,到Kibana的config目录下,找到kibana.yml,在最后面加i18n.locale: "zh-CN",重启就是中文的了。

然后访问IP:5601,kibana会自动去访问9200,也就是elasticsearch的端口号(当然elasticsearch这
个时候必须启动着),然后就可以使用kibana了





2.3 WindowsIK分词器安装:

https://zhuanlan.zhihu.com/p/114643497

原生的分词器:在搜索时会把自己的搜索信息进行分词,分词是将每个字一个一个拆分(因为是老外做的的ES)。这种不符合我们中文的分词情况。所以我们需要采用ik分词器来解决这个问题。

IK提供了2个分词算法:
    ik_smart:最少拆分
    ik_max_word:最细粒度拆分

使用ik分词器的效果: 转自:https://www.cnblogs.com/laoyeye/p/13289034.html


2.3.1 演示原生分词器效果
### 原生分词
GET /_analyze
{
  "analyzer": "standard",
  "text": "中华人民共和国"
}

效果:

{
  "tokens" : [
    {
      "token" : "中",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "华",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "人",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "民",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "共",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    },
    {
      "token" : "和",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "<IDEOGRAPHIC>",
      "position" : 5
    },
    {
      "token" : "国",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "<IDEOGRAPHIC>",
      "position" : 6
    }
  ]
}

2.3.1 演示ik_smart分词器效果(会将文本做最粗粒度的拆分)
# ik_smart:会做最粗粒度的拆分
GET /_analyze
{
  "analyzer": "ik_smart",   // ik_smart分词
  "text": "中华人民共和国"
}

效果:

{
  "tokens" : [
    {
      "token" : "中华人民共和国",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 0
    }
  ]
}

2.3.1 演示ik_max_word分词器效果(会将文本做最细粒度的拆分)
GET /_analyze
{
  "analyzer": "ik_max_word",   // ik_max_word分词
  "text": "中华人民共和国"
}

效果:

{
  "tokens" : [
    {
      "token" : "中华人民共和国",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "中华人民",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "中华",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "华人",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "人民共和国",
      "start_offset" : 2,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "人民",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 5
    },
    {
      "token" : "共和国",
      "start_offset" : 4,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 6
    },
    {
      "token" : "共和",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 7
    },
    {
      "token" : "国",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "CN_CHAR",
      "position" : 8
    }
  ]
}

对于上面两个分词效果的解释:

如果未安装ik分词器,那么,你如果写 "analyzer": "ik_max_word",那么程序就会报错,因为你没有安装ik分词器
如果你安装了ik分词器之后,你不指定分词器,不加上 "analyzer": "ik_max_word" 这句话,那么其分词效果跟你没有安装ik分词器是一致的,也是分词成每个汉字。






3. ES的结构

image


3.1 索引Index——————索引相当于MySQL中的一个“数据库”:

ES将数据存储于一个或多个索引中,ES中可以创建多个索引。

ES会对索引进行分片,[默认一个索引分5片]——————就是说 比如一个索引存了1W条数据,他默认会将其分成5片,每片2000条数据。

ES会对索引的分片进行备份,每一个分片会至少存在一个备份分片【防止数据丢失】,备份的分片称为从分片,一般情况下,从分片不会帮助检索数据,当检索压力特别大才会帮助。

备份的分片应该放在不同的服务器中。如果没有搭建集群,那么分片就只会保存在一个ES服务上。





3.2 文档Document——————相当于mysql表中的“一行数据”:

一个类型下,可以有多个文档。
文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。
文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。
每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。





3.3 属性Field——————相当于mysql表中的“一列数据”:

一个文档中,可以包含多个属性。类似于MySQL表中的一行数据存在多个列。







4. 操作ES的RESTful语法

image




image




image

4.1 索引的操作

4.1.2 查看索引信息
GET /person




4.1.3 删除索引信息
DELETE /person




4.1.4 创建索引

image


如何对索引追加字段?

image





4.1.5 修改索引

索引库一旦创建无法直接修改。解决方法:

方式一:使用PUT命令,对该索引进行重新创建(会覆盖掉原结构,相当于重新创建该索引)

方式二:使用POST命令,后面跟_update。(不相当于重新创建该索引,只会替换同名的字段)






4.2 文档的操作

image

文档操作语法介绍:

image
image
image





4.2.1 文档的增删改查

创建数据POST
image

    _doc是固定写法。
    文档id相当于关系型数据库的主键id,若不指定,则会默认生成一个20位的uuid,属性相当于关系型数据库的column(列)。
    结果中的result是操作类型,created:表示第一次创建,若再次执行该命令,result的类型将变为updated。
                            version:表示当前版本,每改一次就加一。




查询数据GET
image





更新数据PUT/POST【常用】
image



image





删除数据DELETE
image





条件查询

返回的不是数据本身,是一个hits,其中_score表示得分,根据算法去和查询条件进行匹配计算,若匹配度越高,分就越高,查询出来就越靠前。

构建查询

上例方式和条件查询结果是一样的。推荐使用构建查询,其能构建更加复杂的查询条件,结构更清晰。
将构建查询条键放在query属性下。

只查询特定的属性
比如:我们现在只查看name和desc两个属性。

排序查询

分页查询

布尔值查询

不等于查询

自定义过滤

高亮查询







5. Java操作ES

ES官网指导文档:https://www.elastic.co/guide/index.html
API文档:https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-high-level-client/7.10.2/index.html

5.1 导入依赖 一定要保证我们导入的依赖与我们的ES版本一直【最好别使用springboot帮我们自动依赖的版本,哪怕你用的是最新的springboot,它搭载的ES版本可能很旧。可能与你安装的ES版本不符】

	    <!--        1. elasticsearch-->
	    <dependency>
	        <groupId>org.elasticsearch</groupId>
	        <artifactId>elasticsearch</artifactId>
	        <version>7.12.1</version>
	    </dependency>

	    <!--        2. elasticsearch的高级API-->
	    <dependency>
	        <groupId>org.elasticsearch.client</groupId>
	        <artifactId>elasticsearch-rest-high-level-client</artifactId>
	        <version>7.12.1</version>
	    </dependency> 




5.2 连接ES

SpringBoot集成ES

@Configuration
public class ElasticsearchConfig {
    @Bean
    public RestHighLevelClient elasticsearchClient(){
        return new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.13.84.80", 9201, "http")));
    }

}


如何分析需求设计索引?


image





5.3 操作索引

5.3.1 创建索引库

image


image





5.3.2 删除索引库

image





5.3.3 查询索引库

image





5.4 操作文档

5.4.1 新增文档

image


image





5.4.2 删除文档

image





5.4.3 查询文档

image


image





5.4.4 修改文档

image


image

posted @ 2021-02-02 01:23  &emsp;不将就鸭  阅读(93)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3