ElasticSearch7.10.0入门学习

ElasticSearch完成最关键的一个功能就是 大数据搜索

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

简介

Elasticsearch 是一个分布式全文检索引擎

Lucene、Solr、ElasticSearch

  • Lucene
    • 是一套信息搜索工具jar包
    • 包括了:索引结构、读写索引的工具、排序、搜索规则等等工具类
    • 注意:不包括搜索引擎系统
  • Solr
    • 是基于Lucene做了一些封装和增强
    • 通过对外提供Web-service的API接口
  • ElasticSearch
    • 是基于Lucene做了一些封装和增强
    • 通过简单的Restful来隐藏Lucene的复杂性

安装

windows安装es

环境:jdk1.8及以上

官网中可以进行下载,但是因为是外网,速度是极其的慢。而且可能安装失败,所以我们可以通过官网找到你要下载的版本,然后通过华为云镜像去下载。(下方链接)

ElasticSearch: https://mirrors.huaweicloud.com/elasticsearch/?C=N&O=D

在windows上安装es,很方便解压即可使用

解压的目录结构如下

image-20210225231947251

bin 启动文件
config 配置文件
	log4j 日志配置文件
	jvm.options java虚拟机相关配置
	elasticsearch.yml es配置文件 默认:9200端口
lib 相关jar包
log 日志
modules 功能模块
plugins 插件 比如ik分词器

启动

双击bin\elasticsearch.bat

image-20210225232716908

在网页中就可以访问 http://localhost:9200/

image-20210225232757104

安装可视化界面 elasticsearch-head

除了下面的安装方法,你也可以在谷歌浏览器中安装插件elasticsearch head

环境:nodejs

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

下载完成后,尽量将ElasticSearch相关工具放在统一目录下

cd elasticsearch-head #到路径下
npm install -g nrm #全局安装nrm 如果没有安装过安装一下
nrm use taobao #切换镜像
npm install #安装依赖 
npm run start #启动项目

启动

在网页中就可以访问 http://localhost:9200/

但是,出现了跨域问题

image-20210225233754829

elasticsearch.yml文件中配置,解决跨域。注意由于yml的格式问题,冒号后面需要加空格。

修改好配置文件之后重新启动elasticsearch

http.cors.enabled: true
http.cors.allow-origin: "*"

image-20210225234338816

安装kibana

kibana可以将elasticsearch的数据通过友好的界面展示出来,提供实时的分析功能。

官网下载慢,和elasticsearch一样的解决方法,华为云镜像:https://mirrors.huaweicloud.com/kibana/?C=N&O=D

注意:需要保证版本和elasticsearch的版本一致

下载完成后,尽量将ElasticSearch相关工具放在统一目录下

启动

双击bin目录下的kibana.bat

访问 http://localhost:5601

如果说,你在英文方面不太擅长,kibana是支持汉化的

编辑器打开kibana解压目录/config/kibana.yml,添加如下,然后冲洗kibana

i18n.locale: "zh-CN"

直接修改配置就可以实现汉化的原因是在kibana-7.10.0-windows-x86_64\x-pack\plugins\translations\translations中存在了zh-CN.json

ES核心概念

elasticsearch是面向文档。一切都是json。

传统的关系型数据库和elasticsearch进行对比

DB ElasticSearch
数据库 database 索引 indices
表 tables types
行 rows 文档 documents
字段 columns fields

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

IK分词器

分词:即把一段中文或者别的划分成一个个的关键字,默认的中文分词是将每个字看成一个词不使用用IK分词器的情况下)。但是,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。

IK提供了两个分词算法: ik_smartik_max_word ,其中ik_smart最少切分, ik_max_word最细粒度划分!

下载

版本要与ElasticSearch版本对应

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

安装

加压即可(但是我们需要解压到ElasticSearch的plugins目录下),然后压缩包进行删除

重启elasticsearch,可以看到加载了插件

image-20210226085341384

测试

使用kibana的开发工具进行测试,注意:kibana开发工具执行的时候,需要将鼠标选中当前行,然后点击运行

image-20210226082736603

image-20210226082826199

从上面的例子中,感觉分词都比较正常,但是大多数,分词都满足不了我们的想法,如下例

image-20210226083319292

那么,我们需要手动将该词添加到分词器的词典当中

添加自定义的词添加到扩展字典中

elasticsearch目录/plugins/elasticsearch-analysis-ik-7.10.0/config/IKAnalyzer.cfg.xml

我们会看到下面的内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
	<entry key="ext_dict"></entry>
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords"></entry>
	<!--用户可以在这里配置远程扩展字典 -->
	<!-- <entry key="remote_ext_dict">words_location</entry> -->
	<!--用户可以在这里配置远程扩展停止词字典-->
	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

将扩展字典进行修改,然后在和IKAnalyzer.cfg.xml的相同目录下,新建一个my.dic,添加字典

<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">my.dic</entry>

image-20210226090109040

重启ElasticSearch,再次使用kibana测试

可以看到加载了my.dic

image-20210226085252542

image-20210226090007920

Rest风格

基本Rest命令说明

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 查询所有数据

基本操作

1、创建一个索引,添加

PUT /test1/type1/1
{
  "name":"DJ同学",
  "age":22
}

image-20210226090816239

image-20210226091231734

2、字段数据类型

  • 字符串类型:text、keyword
  • 数值型:long、Integer、short、byte、double、float、half floatscaled float
  • 日期类型:date
  • 布尔类型:boolean
  • 二进制类型:binary
  • ...

3、指定字段的类型(使用PUT)

类似于建库(建立索引和字段对应类型),也可看做规则的建立

PUT /test2
{
  "mappings":{
    "properties":{
      "name":{
        "type":"text"
      },
      "age":{
        "type":"long"
      },
      "birthday":{
        "type":"date"
      }
    }
  }
  
}

image-20210226091850258

4、获取3建立的规则

GET test2

5、获取默认信息

_doc 默认类型(default type),type 在未来的版本中会逐渐弃用,因此产生一个默认类型进行代替

PUT /test3/_doc/1
{
  "name":"DJ同学",
  "age":22,
  "birthday":"2021-01-01"
}

GET test3

image-20210226092804335

image-20210226093818177

7、删除

删除索引 DELETE /索引名/~类型名~/文档id 根据需求来判断是删除索引还是删除文档记录!

DELETE test1

8、新增数据

PUT /test4/user/1
{
  "name":"张三",
  "grade":"大一"
}

9、修改数据

你可以使用put的创建命令,直接覆盖。下面提供了最新的修改方法

POST /test4/user/3/_update
{
  "doc":{
    "name":"赵四"
  }
}

10、简单查询数据

GET /test4/user/2

GET /test4/user/_search?q=name:"张三"

11、复杂的查询select(排序,分页,高亮,模糊查询,精准查询)

test4索引中的内容如下

image-20210226110154487

查询匹配

  • sort 只能用于数字类型,而且所有的score会变成null
  • _source 过滤字段,默认显示所有字段
GET /test4/user/_search
{
  "query":{
    "match": {
      "name":"三三"
    } 
  }
  ,"_source": ["name","desc"]
  ,"sort":[
    {
      "age":{
        "order":"asc"  
      }
    }]
    ,"from": 0
    ,"size": 1
}

image-20210226111021827

多条件查询(bool)

  • must 相当于 and
  • should 相当于 or
  • must_not 相当于 not (... and ...)
  • filter 过滤
GET /test4/user/_search
{
  "query":{
    "bool":{
      "must":[
          {
            "match":{
              "name":"三"  
            }
          }
          ,
          {
            "match":{
              "age":9  
            }
          }
        ]
    }
  }
}

GET /test4/user/_search
{
  "query":{
    "bool":{
      "must":[
          {
            "match":{
              "name":"三"  
            }
          }
        ]
        ,"filter":{
          "range": {
            "age": {
              "gte": 0,
              "lte": 20
            }
          }
        }
    }
  }
}

精确查询

  • term 直接通过 倒排索引 指定词条查询
  • 适合查询 number、date、keyword ,不适合text
GET /test4/user/_search
{
	"query": {
	  "term": {
	    "name":"张三"
	  }
	}
}

高亮查询

GET test4/user/_search
{
  "query": {
    "match": {
      "name":"张三"
    }
  }
  ,
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}
// 自定义前缀和后缀
GET test4/user/_search
{
  "query": {
    "match": {
      "name":"张三"
    }
  }
  ,
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>",
    "post_tags": "</p>", 
    "fields": {
      "name": {}
    }
  }
}

集成springboot

Java High Level REST Client 高级客户端api测试

官网学习api:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/java-rest-high.html

包括了索引和文档的CRUD,代码es-api https://gitee.com/dz138598/elasticsearch-study/tree/master/

实战

代码:https://gitee.com/dz138598/elasticsearch-study/tree/master/jd-project

image-20210226225843737

posted @ 2021-02-26 23:05  DJ同学  阅读(738)  评论(0编辑  收藏  举报