ElasticSearch-分布式搜索引擎

前言

版本: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、 下载

2、 es安装
访问 http://127.0.0.1:9200/

3、 es-head下载

修改elasticsearch.yml文件

http.cors.enabled: true
http.cors.allow-origin: "*"
复制代码

4、 重启es-head

启动npm run start

5、 kibana安装

--设置中文
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来解决这个问题,

  • 下载

github.com/medcl/elast…

  • 安装

解压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” 最细粒度分词器,穷尽词库的可能

可自行配置字典信息

  1. 在分词器目录下,有个config目录/plugins/ik/config
  2. 在config中,添加一个mydic.dic文件,自定义字典文件
  3. 修改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>
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享