ES

发布时间 2023-11-04 21:47:25作者: 清风凉明月亮

1、ElasticSearch简介

主要用于全文搜索
Luence是一套信息检索工具的工具包,包含索引结构,读写索引的工具,排序,搜索规则,ElasticSearch是基于Luence做了一些封装和增强。
es是一个开源的高扩展的分布式全文检索和分析引擎,它可以近乎实时的存储、检索数据;扩展性好,可以扩展到上百台服务器,处理PB级别的数据。

ELK技术:ElasticSearch+Logstash+Kibana

大数据:存储+计算

2、ElasticSearch安装

要求:JDK1.8,ElashticSearch客户端,界面工具。
官网:https://www.elastic.co/

目录结构:
  bin:启动文件
  config:配置文件
     log4j2 日志配置文件
     jvm.options java虚拟机相关配置
     ElasticSearch.yml ElasticSearch相关的配置文件,默认端口9200
  lib 相关jar包
  plugins 插件
  

启动:

运行./bin/elasticsearch.bat脚本即可
浏览器中访问 http://localhost:9100/

安装可视化界面es的插件


1.下载地址:https://github.com/mobz/elasticsearch-head
2.启动:npm install
npm run start 
3.连接测试存在跨域问题:
在./config/elasticsearch.yml文件中增加
http.cors.enabled: true 
http.cors.allow-origin: "*"

可以将es当作一个数据库,(索引【库】,文档【表】)

3、ELK

ELK是ElasticSearch、Logstash、Kibana三大开源框架的首字母大写简称,ElasticSearch是实时搜索平台框架;Logstash是ELK的中央数据流引擎,用于从不同的目标(文件/数据存储/MQ)中收集不同的数据格式,经过过滤后输出到不同的目的地(文件/MQ/redis/kafka/elasticsearch);Kibana可以将elasticsearch的数据通过页面展示出来。

3.1 Kibana

Kibana:是针对ElasticSearch的开源分析及可视化平台,用来搜索、查看交互存储在elasticsearch索引中的数据
官网:https://www.elastic.co/cn/kibana/下载(kibana版本需要和es一致),解压安装,bin目录下执行.bat文件
访问测试
http://localhost:5601/?code=568771

3.2 ES核心概念

es是面向文档的,一切都是json
集群
节点
索引:数据库
类型:表(之后会弃用)
文档:行
fields:列

物理设计:elasticSearch在后台会把每个索引分成多个分片,每个分片可以在集群中的不同服务器之间迁移
逻辑设计:包含key:value,是一个json对象,文档不需要依赖预先定义的模式,关系型数据库中需要提前定义字段才能使用
分片
映射
es集群下可以有多个索引(数据库),每个索引下可以有多个类型(表),每个类型下可以有多个文档(行),每个文档中可以包含多个字段(列)

3.3 Rest风格操作

3.3.1索引的基本操作,索引类似数据库
创建索引并插入一条数据:
PUT /索引名/类型名(之后默认是_doc)/文档id
{请求体}

PUT /testbai/_doc/1
{
  "name": "狂神",
  "age": 3
}

创建索引并指定对应的字段和类型:
PUT /testbai2
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      },
      "age":{
        "type": "long"
      },
      "birth":{
        "type": "date"
      }
    }
  }
}

获取索引信息:
GET /testbai

修改数据,使用put,会覆盖原有数据,version会加1,状态变为updated:
PUT /索引名/类型名/文档id
{请求体}

POST /索引名/类型名/文档id/_update
{请求体}

删除索引:
delete 索引名称
delete 索引名称/类型名/文档id
3.3.2文档的基本操作

文档类似数据库的行

添加数据,如果重复put同一个id数据会覆盖,version会更新:
PUT /testuser/user/1
{
  "name": "李四",
  "age": 23,
  "desc": "it,技术宅"
}

获取数据:
GET /testuser/user/1

更新数据:
如果重复put同一个id数据会覆盖,version会更新,如果字段少了,数据会置空:
PUT /testuser/user/1
{
  "name": "李四",
  "age": 23,
  "desc": "it,技术宅"
}

POST _update,推荐这种方式,会更新指定的字段,其他的字段保存不变,如果不加_update会更新指定的字段,其他的字段置空
PUT /testuser/user/1/_update
{
  "doc":{
     "name": "李四"
  }
 
}


条件查询:
GET /testbai/_doc/_search?q=name:xxx


GET /testbai/_search
{
  "query": {
    "match": {
      "name": "李四"
    }
  }
}

GET /testbai/_search
{
  "query": {
    "match": {
      "name": "李四"
    }
  },
  "_source": [
    "name","age"
  ]
}
_source:只查询name和age字段的结果

排序并分页:
GET /testbai/_doc/_search
{
  "query": {
    "match": {
      "name": "李四"
    }
  },
  "sort": [
    {
      "age": {"order": "asc"}
    }
    ],
    "from": "0",
    "size": "1"
}

bool query 查询是把任意多个简单查询组合在一起,每个选项的含义如下:

must:文档必须匹配,该选项下的查询条件,相当于逻辑运算的 AND,且参与文档相关度的评分。
should:文档可以匹配 should 选项下的查询条件也可以不匹配,相当于逻辑运算的 OR,且参与文档相关度的评分。
must_not:与 must 相反,匹配该选项下的查询条件的文档不会被返回;需要注意的是,must_not 语句不会影响评分,它的作用只是将不相关的文档排除。
filter:用于过滤,范围值的查询。
term可精确查询,match会用分词器进行解析

keyword和text类型:
keyword不会被分词器分析,作为一个整体
text会被分词器拆分

高亮显示:
GET testbai/_search
{
  "query": 
  {
    "match":
    {
      "name": "狂神"
    }
  },
  "highlight": {
    "fields": {"name": {}}
  }
  
}

4、倒排索引

关键词到文档id的映射
对文档进行分词,形成词项字典和倒排表的对应关系