前言
版本:ElasticSearch 7.6.1
ElasticSearch solo:搜索(百度,github,淘宝电商),开源的高扩展的分布式全文搜索引擎,近乎实时搜索,检索数据。它用于全文搜索、结构化搜索、分析以及将这三者混合实用。
ELK=elasticsearch+logstash+kibana
solr简介
基于lucene的全文搜索服务器,实现了可配置,可扩展,并对索引和搜索性能进行了优化
ES和solr的区别
- es基本是开箱即用,非常简单,solr安装稍微复杂一点
- solr利用zk来进行分布式管理,而ES自带分布式协调管理功能
- solr支持更多的数据,比如JSON、XML、CSV,而ES仅支持JSON文件格式
- solr官方提供的功能更多,而ES更注重于核心功能
- solr查询快,但更新索引慢,多应用于电商搜索多的场景
- solr比较成熟,而ES开发维护者较少,更新也比较快
聊聊Lucene
Doug Cutting的美国工程师,做了一个用于文本搜索的函数库,命令为lucene,是用JAVA写的,目标是为各种中小型应用软件加入全文检索功能
主题
Lucene是一套信息检索工具包,jar包,不包含搜索引擎系统
包含的:索引结构,读写索引的工具,排序,搜索规则….工具类
ES是基于lucene做了一些封装和增强,支持文本搜索、结构化数据,非结构化数据
es安装
声明:JDK1.8最低版本!
1、 下载
- ElasticSearch: mirrors.huaweicloud.com/elasticsear…
- logstash: mirrors.huaweicloud.com/logstash/?C…
- kibana: mirrors.huaweicloud.com/kibana/?C=N…
2、 es安装
访问 http://127.0.0.1:9200/
3、 es-head下载
- 下载github.com/mobz/elasti…
- 前提需要安装node.js和grunt:www.cnblogs.com/mentiantian…
- 执行npm install安装head
- 启动npm run start,(有跨域问题,具体解决参考下面步骤)
- 修改es跨域配置
修改elasticsearch.yml文件
http.cors.enabled: true
http.cors.allow-origin: "*"
复制代码
4、 重启es-head
启动npm run start
5、 kibana安装
- 下载www.elastic.co/cn/download…
- 拆箱即用
- 修改kibana.yml配置
--设置中文
i18n.locale: "zh-CN"
复制代码
kibana简介
kibana是针对es的开源分析及可视化平台,用来搜索、查看存储在es中的数据,通过各种图表进行高级分析和展示。
ES核心数据
- 基本概念
索引(index) -- Databases 数据库
类型(type)被弃用 -- Table 数据表
文档(documents) -- Row 行
字段(field) -- columns 列
复制代码
- 物理设计
es在后台是把每个索引划分成多个分片,每个分片可以再集群中的不同服务器间迁移,一个节点就是集群,默认集群的名称就是elasticsearch
- 逻辑设计
一个索引类型中,包含多个文档,当我们索引一篇文档时,可以通过一顺序找到索引/类型/文档id
文档
elasticsearch就是面向文档的,就是我们一条条数据,文档有几个重要属性
- 自我包含,一个文档同时包含字段和对应的值,就是key:value
- 可以是层次型,一个文档包含子文档,就是一个json对象
- 灵活的结构,文档不依赖预先定义的模式,在es中,对于字段是非常灵活的,有时候可以忽略字段,也可以动态添加一个字段
类型
类型是文档的逻辑容器,类型中对于字段的定义成为映射
- 字符串类型:text、keyword(不可分割)
- 数值类型:long、integer、short、byte、double、float、half float、scaled float
- 日期类型:date
- 布尔值类型:boolean
- 二进制类型:binary
索引
就是数据库,是映射类型容器,非常大的文档集合,存储了映射类型的字段和其他设置,然后被存储到各个分片上
分片
就类似于数据库的分表,一个索引可以存储超出单个节点硬件限制的大量数据,
- 允许水平分割/扩展内容容量
- 允许在分片之上进行分布式、并行操作,提高性能吞吐量
副本(replicas)
分片的备份
- 提供高可用行
- 提供了搜索量/吞吐量,可在副本上进行数据搜索
节点和分片如何工作
一个集群至少一个节点,一个节点就是elasticsearch的进程,节点可以有多个索引,创建一个索引,索引将会有5个分片(primary shard主分片)构成,每个主分片都有一个副本(replica shard)
倒排索引
elasticsearch使用的是一种称为倒排索引的结构,采用Lucene倒排索引为底层,这种结构适用于快速的全文检索,一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。
elasticsearch与lucne的索引对比
在es中,索引被分为多个分片,每个分片都是一个个倒排索引,每个分片都是Lucene的索引,由多个Lucene索引组成
什么是IK分词器
分词:把一段中文或者别的划分成一个个关键字,我们在搜索的时候会把自己的信息进行分词,把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,需要安装中文分词器ik来解决这个问题,
- 下载
- 安装
解压zip到es/plugins/ik的插件目录里,重启es
- 使用
GET _analyze
{
"analyzer": "ik_smart",
"text": "中国共产党"
}
GET _analyze
{
"analyzer": "ik_max_word",
"text": "中国共产党"
}
GET _analyze
{
"analyzer": "standard",
"text": "中国共产党"
}
复制代码
- “analyzer”:”standard” 标准分词器
- “analyzer”:”ik_smart” 最少切分分词器
- “analyzer”:”ik_max_word” 最细粒度分词器,穷尽词库的可能
可自行配置字典信息
- 在分词器目录下,有个config目录/plugins/ik/config
- 在config中,添加一个mydic.dic文件,自定义字典文件
- 修改ik/config目录的IKAnalyzer.cfg.xml文件,配置自己的扩展字典
<entry key="ext_dict">mydic.dic</entry>
复制代码
基本操作
- 创建索引
如果字段没有制定类型,那么es会自动默认配置字段类型
-- 新增数据并自动创建索引 /索引/类型/id
PUT /testindex/_doc/1
{
"name":"ted",
"age":"23"
}
-- 创建索引并制定字段类型
PUT /testindex1
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age":{
"type": "date"
},
"birthday":{
"type": "date"
}
}
}
}
-- 查询索引基本信息
GET testindex1
复制代码
- 获取es信息
-- 通过_cat命令可以获得es当前信息
GET _cat/health
GET _cat/indices?v
复制代码
- 修改索引
-- 后面不增加_update会全部覆盖
POST /testindex/1/_update
{
"doc":{
"name":"法外狂徒张三"
}
}
复制代码
- 删除索引
DELETE /testindex/1
复制代码
基本查询
-- 查询/索引/类型/id
GET /index1/_doc/4
-- 简答查询
GET /index1/_doc/_search?q=name:李四
复制代码
复杂查询
参数体按json查询
GET /test1/user/_search
{
"query":{ #具体查询参数体
"match":{
"name":"test"
}
},
#需要展示的过滤结果
"_source":["name","desc"]
"sort":[{ #按age倒叙排序
"age":{
"order":"desc"
}
}],
"from":0, #分页开始序号
"size":20 #返回多少条数据
}
复制代码
布尔值查询
must(and),所有的条件都要符合
should(or),所有的条件符合其中一个
must_not(not),反向操作
GET /index1/_doc/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"李四"
}
},{
"match":{
"age":"30"
}
}],
"filter":{
"range":{
"age":{
"gt":10,
"lt":80
}
}
}
}
}
}
复制代码
匹配多个条件
GET /test1/user/_search
{
"query":{ #匹配多个条件,用空格分隔
"match":{
"tag":"男 技术"
}
}
}
复制代码
精确查询条件
- term查询是直接通过倒排索引制定的词条进行精确查找的
- match,会使用分词器解析
GET /test1/user/_search
{
"query":{ #精确的查找
"term":{
"tag":"男 技术"
}
}
}
复制代码
分词器解析
GET _analyze
{
"analyzer":"standard", #普通分词、keyword关键字分词
"text":"泰德敲代码"
}
复制代码
精确查询多个值
GET /testdb/_search
{
"query":{
"bool":{
"should":[{
"term":{
"t1":"22"
}
},{
"term":{
"t2":"33"
}
}]
}
}
}
复制代码
高亮查询
GET /index2/_doc/_search
{
"query":{
"match":{
"name":"泰德2"
}
},
"highlight":{
"pre_tags":"<p class='key' style='color:red'>",
"post_tags":"</p>",
"fields":{
"name":{}
}
}
}
复制代码
集成springboot上手
自定义es版本,与实际一致
<elasticsearch>7.10.2</elasticsearch>
复制代码