【基础】Elasticsearch 基础

news2025/1/15 20:43:43

Elasticsearch 基本概念及使用

  • Elasticsearch 基本概念
    • ES 的简介及使用场景
    • ES 基本概念
    • ES 与 Kibana 的安装
  • Elasticsearch 分词器
    • ES 内置分词器
    • ik 分词器的安装和使用
  • Elasticsearch 基本使用
    • 索引操作
    • 数据的增删改查
    • DSL 查询
    • 聚合查询
    • 批量操作

Elasticsearch 基本概念

ES 的简介及使用场景

  • Elasticsearch 是一个分布式、高性能、高可用、可扩展、REST 风格的搜索和数据分析引擎;

  • Elasticsearch 搜索速度很快,是一个近实时的搜索引擎,从数据添加到可以搜索到该数据之间延迟极低;

  • Elasticsearch 可以配合 Logstash 和 Kibana 来做日志分析系统,一般在开发中也用作商城搜索引擎或物联网实时大数据的搜索;

ES 基本概念

下列表格描述了 Elasticsearch 与 MySQL 的核心概念的类比关系:

ElasticsearchMySQL概述
字段字段对应数据库中的列,每个字段都有自己的数据类型
文档数据行文档是 ES 中可搜索数据的最小单元,其实际上就是一条 JSON 数据,由字段组成
类型类型就是数据库中的表,从 7.0 版本开始,一个索引下就只能创建一个索引了(_doc)
索引索引就是数据库,它是一类文档的集合
节点节点实际上就是一个实例,以保证高性能、高可用
分片类似数据库的分库分表,通过分片可以对数据进行垂直切分,每一个分片都是独立的且功能完整的索引,可以分布在任何的集群节点上
副本副本可以保证高可用,在出现问题时实现故障转移,ES 可以将索引的一个或者多个分片复制成副本分片

ES 与 Kibana 的安装

参考博客:Docker安装ElasticSearch和Kibana

ES 启动容器命令

docker run --name elasticsearch \
--restart=always \
-p 9200:9200  -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms84m -Xmx256m" \
-v /root/es/data:/usr/share/elasticsearch/data \
-v /root/es/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.17.7

Kibana 启动容器命令

docker run --name kibana \
--link=elasticsearch:elasticsearch \
-p 5601:5601 \
-d kibana:7.17.7

Elasticsearch 分词器

ES 内置分词器

ES 将 text 格式的字段按照分词器分词并进行索引的设置,这是其查询速度较快的根本原因。其内置了很多分词器,如下表所示。

分词器名称规则
standard默认的分词器,按照单词进行分类并进行小写处理
simple按照非字母进行切分,然后去除非字母并进行小写处理
stop按照停用词(the\a\is)进行过滤并进行小写处理
whitespace按照空格进行分词
keyword不进行分词处理,将文本视为一个整体

可以使用下列语句进行测试,观察不同分词器的区别

POST /_analyze
{
  "analyzer":"standard",
  "text":"basketball, League of Legends, my love"
}
POST /_analyze
{
  "analyzer":"simple",
  "text":"It is a tiger"
}
POST /_analyze
{
  "analyzer":"stop",
  "text":"It is a tiger"
}
POST /_analyze
{
  "analyzer":"whitespace",
  "text":"I am Iron Man"
}
POST /_analyze
{
  "analyzer":"keyword",
  "text":"I am Iron Man"
}

这些内置的分词器对于英文文本有很好的支持,但是对于中文却无法进行较好的分析,如下图,在使用默认的分词器进行分词分析时,一句完整的句子将被分割成一个一个单独的中文字符,这显然不符合中文的语言习惯。

在这里插入图片描述

因此,对于中文,我们需要使用 ik 分词器进行分析。

ik 分词器的安装和使用

首先在 ik 分词器的 github 网站上选择与 ES 相同版本的 ik 分词器进行下载,将下载后的 zip 文件在文件夹中进行解压。

mkdir elasticsearch_ik
cd elasticsearch_ik
unzip elasticsearch-analysis-ik-7.17.7

解压完成后将解压后的文件夹复制到 docker 容器当中

docker cp elasticsearch_ik elasticsearch:/usr/share/elasticsearch/plugins/

重启 elasticresearch 容器

docker restart elasticresearch

至此 ik 分词器安装成功,可以进行简单的测试,查看 ik 分词器对中文的分词效果,可以看到,ik 分词器将中文语句按照中文词语进行了分词

在这里插入图片描述

ik 分词器在其 config 文件夹下的 main.dic 文件中维护了一个字典词库,如果我们需要添加自定义的词库,直接将相应的词语添加到这个文件中即可

Elasticsearch 基本使用

下述操作基于 Kiibana 的 dev_tools 实现,es 与 kibana 的版本均为 7.17.7

索引操作

创建索引:创建一个 2 分本 2 分片的、名称为 test 的索引

PUT /test
{
  "settings": { 
    "number_of_shards": "2", 
    "number_of_replicas": "2"
  } 
}

修改索引副本数:将副本数修改为 1(索引的分片不允许修改)

PUT test/_settings 
{ 
  "number_of_replicas" : "1" 
}

查询索引

GET /test

删除索引

DELETE /test

数据的增删改查

新增数据:指定 id 插入数据

POST /test/_doc/1 
{
  "name":"曹操",
  "country":"魏",
  "age":62
}

查询数据

# 查询数据(全局搜索查询)
GET /test/_search
# 查询数据(指定id查询)
GET /test/_doc/1
# 查询数据(按照关键字搜索)
GET /test/_search?q=name:"曹操"

修改数据:ES 中的数据是无法修改的,每一次修改都是对原有数据的覆盖数据的修改分为全局更新和局部更新

修改数据–全局更新:对数据内容进行全部的替换,即使内容相同也执行替换,执行全局更新会使查询时查到的_version字段 +1

PUT /test/_doc/1 
{
  "name":"曹操",
  "country":"汉"
  "age":18
}

修改数据–局部更新:对不同的数据内容进行替换,内容相同的数据不做操作,执行局部更新同样会使查询时查到的_version字段 +1

POST /test/_update/1 
{
  "doc":
  {
    "country":"魏"
  } 
}

删除数据

DELETE /test/_doc/1

DSL 查询

term查询:用于查询精确匹配的值,如数字、日期、布尔值等,若需要对匹配值进行整词查询,则需要使用keyword关键字

POST /test/_search
{
  "query": {
    "term": {
      "age": 18
    }
  }
}
POST /test/_search
{
  "query": {
    "term": {
      "name.keyword": "曹操"
    }
  }
}

terms查询:同term查询,可以匹配多个值

POST /test/_search
{
  "query": {
    "terms": {
      "age": [18,28]
    }
  }
}

range查询:用于范围查询数据,范围查询条件有gt\gte\lt\lte

POST /test/_search
{
  "query": {
    "range": {
      "age": {
        "gt": 30,
        "lt": 60
      }
    }
  }
}

exists查询:用于查询包含某个字段的数据

POST /test/_search
{
  "query": {
    "exists": {
      "field": "name"
    }
  }
}

match查询:用于标准查询,该查询会进行分词查询

POST /test/_search
{
  "query": {
    "match": {
      "name": "曹操"
    }
  }
}

match_phrase查询:该查询不会忽略空格(match会忽略空格)

POST /test/_search
{
  "query": {
    "match_phrase": {
      "name": "曹操"
    }
  }
}

bool查询:可以对多个查询条件进行组合查询,常用的关键字包括:

  • must:多个查询条件必须完全匹配;

  • must_not:多个查询条件必须完全不匹配;

  • should:多个查询条件至少匹配其中一个;

POST /test/_search
{
  "query": {
    "bool": {
      "must": {
        "term": {
          "name": "曹"
        }
      },
      "must_not": {
        "term": {
          "country": "吴"
        }
      },
      "should": [
        {
          "term": {
            "age": 18
          }
        },
        {
          "term": {
            "age": 28
          }
        }
      ]
    }
  }
}

filter查询:通常跟bool连用,用于过滤查询的数据

POST /test/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "country": "魏"
        }
      }
    }
  }
}

聚合查询

聚合函数查询max\min\sum\avg,按照函数意义进行聚合查询

POST /test/_search
{
  "aggs": {
    "test": {
      "min": {
        "field": "age"
      }
    }
  },
  "size": 0
}

去重查询cardinality根据指定字段进行去重统计

POST /test/_search
{
  "aggs": {
    "test": {
      "cardinality": {
        "field": "age"
      }
    }
  },
  "size": 0
}

统计数量value_count根据指定字段进行数据量统计

POST /test/_search
{
  "aggs": {
    "test": {
      "value_count": {
        "field": "age"
      }
    }
  },
  "size": 0
}

terms 词聚合:使用terms按照指定字段进行数据分组聚合

POST /test/_search
{
  "aggs": {
    "test": {
      "terms": {
        "field": "age"
      }
    }
  },
  "size": 0
}

top_hits 聚合:使用top_hits可以查询按指定字段分组后的前 n 条数据

POST /test/_search
{
  "aggs": {
    "test": {
      "terms": {
        "field": "age"
      },
      "aggs": {
        "count": {
          "top_hits": {
            "size": 3
          }
        }
      }
    }
  },
  "size": 0
}

range 范围聚合:使用range可以对按照指定字段分组后的数据进行范围分组

POST /test/_search
{
  "aggs": {
    "group_by_id": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 50,
            "to": 60
          },
          {
            "from": 10,
            "to": 20
          }
        ]
      }
    }
  },
  "size": 0
}

批量操作

批量插入数据

POST _bulk
{ "create" : { "_index" : "test", "_id" : "1" } }
{"name":"曹操","country": "魏","age": 18}
{ "create" : { "_index" : "test", "_id" : "2" } }
{"name":"刘备","country": "蜀","age": 38}
{ "create" : { "_index" : "test", "_id" : "3" } }
{"name":"孙权","country": "吴","age": 28}
{ "create" : { "_index" : "test", "_id" : "4" } }
{"name":"张辽","country": "魏","age": 18}
{ "create" : { "_index" : "test", "_id" : "5" } }
{"name":"张郃","country": "魏","age": 18}
{ "create" : { "_index" : "test", "_id" : "6" } }
{"name":"徐晃","country": "魏","age": 28}
{ "create" : { "_index" : "test", "_id" : "7" } }
{"name":"于禁","country": "魏","age": 38}
{ "create" : { "_index" : "test", "_id" : "8" } }
{"name":"乐进","country": "魏","age": 18}

批量查询数据

POST /test/_mget
{
  "ids": [
    "4",
    "5",
    "6"
  ]
}

批量修改数据

POST _bulk
{ "update" : {"_id" : "4", "_index" : "test"} }
{ "doc" : {"name" : "荀彧"}}
{ "update" : {"_id" : "5", "_index" : "test"} }
{ "doc" : {"name" : "荀攸"}}

批量删除数据

POST _bulk 
{ "delete" : { "_index" : "test", "_id" : "4" } } 
{ "delete" : { "_index" : "test", "_id" : "5" } }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程锁相关

日升时奋斗,日落时自省 目录 1、常见的锁策略 1.1、悲观锁vs乐观锁 1.2、轻量级锁vs重量级锁 1.3、自旋锁vs挂起等待锁 1.4、互斥锁vs读写锁 1.5、公平锁vs非公平锁 1.6可重入锁vs不可重入锁 2、CAS 2.1、CAS解析 2.2、CAS的应用场景 2.2.1、实现原子类 …

JavaSE学习day2_03, 算数运算符

5. 算术运算符 5.1 分类: - * / % 5.2 细节: 1.运算规则。跟小学数学是一模一样的 2.如果是整数跟整数进行计算,结果只能是整数。直接去掉小数部分,保留整数。如5/22,而不是2.5. 3.如果想要结果中有小数,需要有小…

(二)K8S Namespace 和 Label

Namespace 1、K8S集群中默认的Namespace为default,通过Namespace可以实现Pod之间的相互隔离(如测试环境、生成环境的隔离) 2、通过K8S的资源配置机制限定不同的Namespace对CPU、内存的使用,再通过K8S授权机制将不同的Namespace交…

启动ruoyi框架(初学)

启动ruoyi框架(初学)(RuoYi) Ruo Yi启动ruoyi框架(初学)([RuoYi](http://doc.ruoyi.vip/))一、简介二、项目启动1.前端模组:RUOYI-UI2.后端模组:3.环境要求&a…

Java版阿里云/腾讯云域名动态映射DDNS到动态IPv4或IPv6

1 介绍 利用业余时间,整合了一下阿里云和腾讯云动态域名映射,并将其使用spring boot做了一下封装,正好可以把家里的闲置电脑和IP v6利用起来,具体使用方法如下,或者参考对应项目的readme文档 2 地址 aliyun-ddns&am…

数据分析-深度学习 Day3

youtube课程地址:(实时更新)https://www.youtube.com/playlist?listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2Jwww.youtube.com/playlist?listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2JB站课程地址:李宏毅2021机器学习【week3】&#xff1a…

基于tensorflow框架bert的自然灾害描述文本分类详细教程

概述: 使用tensorflow框架: 预测给定的推文是否与真正的灾难有关。如果是这样,预测一个1。如果不是,预测一个0 数据展示:

Java之String概述、对象创建原理和常见面试题、String类常用API、案例

目录String、ArrayList前言String简单介绍Arraylist简单介绍String 概述String类的特点详解总结String类创建对象的两种方式两种方式有什么区别吗?总结String常见面试题String类常用API-字符串内容比较总结String类常用API-遍历、替换、截取、分割操作String案例验证…

内存管理(C/C++)

内存管理(C/C)C/C内存分布C语言中的动态内存管理方式C中动态内存管理new / delete 操作内置类型new 和 delete 操作自定义类型operator new 和 operator delete 函数operator new 和 operator delete 函数new 和 delete 的实现原理内置类型自定义类型定位…

【人工智能原理自学】激活函数:给机器注入灵魂

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 🔔本文讲解激活函数:给机器注入灵魂,一起卷起来叭! 目录一、“分…

已解决pandas正确创建DataFrame对象的四种方法(通过list列表、dict字典、ndarray、Series对象创建)

已解决(pandas创建DataFrame对象失败)ValueError: 4 columns passed, passed data had 2 columns 文章目录报错代码报错翻译报错原因解决方法创建DataFrame对象的四种方法1. list列表构建DataFrame2. dict字典构建DataFrame3. ndarray创建DataFrame4. Se…

【MySQL】十一,存储引擎

查看存储引擎 查看mysql提供什么存储引擎 设置系统默认的存储引擎 查看默认的存储引擎 show variables like %storage_engine%; SELECT default_storage_engine;修改默认的存储引擎 如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作…

08、ThingsBoard使用msa构建镜像并上传到Harbor

1、概述 今天讲解如何使用thingsboard源码中的msa模块来构建镜像,首先我先说一下这个模块的作用,很多人都不明白msa是如何构建镜像的,msa下面创建了很多模块,每个模块都是一个应用,就像我们平时微服务一样可以独自启动,thingsboard是使用这些模块去其它模块拉取代码过来…

卷积神经网络 Convolutional Neural Network (CNN)

CNNObservation 1Observation 2Benefit of Convolutional LayerMultiple Convolutional LayersComparision of Two StoriesObservation 3Convolutional Layers PoolingApplication: Playing GoTo learn more ...仅供个人学习,不具参考价值! Image Class…

python代码运行速度有点慢 ? 教你使用多线程速度飞升

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 在我们爬取数据的时候,有时候它运行速度会非常慢 那么怎么解决呢? 这里给大家带来一个多线程的方法 我们用采集二手车来举例 环境使用: Python 3.8 Pycharm 模块使用: requests 数据请求模…

JVM类加载机制-让你明明白白的了解类的执行流程

一、类加载运行过程1.1 类加载到jvm的流程当我们使用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到jvm里。1.2 loadClass的类加载过程其中loadClass的类加载过程有如下几步:加载 >> 验证 >> 准备 >> 解析…

关于Visual Studio C++项目属性设置的说明

链接器—常规—输出文件 这里的输出文件指的是最终生成的exe文件 C/C–常规—附加包含目录 这里指的是需要include的一些头文件所在的 目录,可以提前在项目文件中建立好include文件,然后在这里设置,以后将一些自定义的include头文件放在这个…

Python之父强烈推荐,爬虫入门经典《python3网络爬虫开发实战》

实操性很强的一本工具书,由浅入深,深入浅出。前面从环境配置到爬虫原理、基本库和解析库的使用再到数据存储,一步步把基础打好,然后再分门别类介绍了Ajax、动态页、验证码、App的爬取、识别等,还讲解了代理使用、模拟登…

【Java】Spring中Aware接口的作用

Spring的几个aware接口的用法 ApplicationContextAware public interface ApplicationContextAware extends Aware {void setApplicationContext(ApplicationContext applicationContext) throws BeansException; }该接口仅有一个方法,用于设置Spring容器上下文。…

浅谈Springboot自动配置

目录 1.自动配置原理 2.自动配置案例 3.总结 1.自动配置原理 在一个Springboot程序中,我们只需要在main程序中使用springBootApplication注解即可标记为一个一个Springboot程序,然后使用 SpringApplication.run(TestMain.class,args) 代码即可创建…