Elasticsearch入门指南(一)

一、Elasticsearch是什么?

  • Elasticsearch 是一款强大的开源搜索引擎,可以帮助我们快速从海量数据中找到所需内容。
  • 它与 Kibana、Logstash、Beats 共同组成 Elastic Stack (ELK),广泛应用于日志分析和实时监控。
  • Elasticsearch 是 Elastic Stack 的核心,负责数据的存储、搜索和分析。

核心功能:

  • 🔍 快速检索:支持关键词、模糊、地理位置等多种搜索方式
  • 📊 数据分析:聚合统计、数据可视化(配合Kibana)
  • 实时处理 :日志监控、实时预警(配合Logstash)

elasticsearch的发展

  • Lucene :由 Doug Cutting 于 1999 年开发,是一个 Java 搜索引擎库,官网:Lucene
    • 优势:易扩展、高性能(基于倒排索引)。
    • 缺点:限于 Java 语言,学习曲线陡峭,不支持水平扩展。
  • 2004 年,Shay Banon 基于 Lucene 开发了 Compass。
  • 2010 年,Shay Banon 重写 Compass,命名为 Elasticsearch,官网:Elastic
    • 优势:支持分布式和水平扩展,提供 RESTful 接口,可被多种语言调用。

搜索引擎技术排名:

1.Elasticsearch:开源的分布式搜索引擎

2.Splunk:商业项目

3.Solr:Apache的开源搜索引擎

基本概念介绍

正向索引和倒排索引

什么是文档和词条?

  • 文档( document) :每条数据就是一个文档,es中是Json格式
  • 词条(term) :文档中按照语义划分的词语。

什么是正向索引?

  • 基于文档id创建索引,查询时需先找到文档,再判断是否包含词条。

什么是倒排索引(Inverted Index?

  • 对文档内容进行分词,记录词条及其所在文档。查询时先通过词条找到文档 ID,再获取文档内容。

词条索引(Term Index) 通过词条前缀构建目录索引

词条和词条之间,有些前缀是一样的,比如follow和forward前面的fo是一致的,如果将部分term前缀提取出来,就可以用更少的空间表达更多的term

利用这些词条的前缀信息,可以构建出一个精简的目录树。目录树的节点存放这些词条在磁盘中的偏移量,也就是指向磁盘中的位置。这个目录树结构,体积小,适合放在内存中,就是所谓的term index. 可以用它来加速搜索。

存储结构

  • Stored Fields:行式存储,存放完整文档内容。
  • Doc Values :用于排序和聚合,将散落在文档中的字段集中存放,以提高排序效率。


    当用户经常需要根据某个字段排序文档,比如按时间排序或商品价格排序。但问题来了,这些字段散落在文档里,也就是说,要先获取Stored Fields里的文档,再提取出内部字段进行排序,比较耗时。
    可以用空间换时间的思路,再构造一个列式存储结构,将将散落在各个文档的某个字段,集中存放。当我们想要对某个字段排序的时候,就只需要将这些集中存放的字段一次性取出来,就能做到针对性地进行排序。

Segment

倒排索引用于搜索,Term Index 用于加速搜索,Stored Fields 用于存放文档的原始信息,以及 Doc Values 用于排序和聚合。这些结构共同组成了一个复合文件,也就是所谓的"segment", 它是一个具备完整搜索功能的最小单元。

概念名词介绍 es VS MySQL

MySQL Elasticsearch 说明
表(Table) 索引(Index) 存储同类型数据,索引是文档的集合,类似数据库的表
行(Row) 文档(Document) 一条条数据,类似数据库的行,文档是JSON格式
列(Column) 字段(Field) JSON文档中的字段,类似数据库的列
Schema Mapping Mapping是索引中文档的约束,例如字段类型约束。类似数据库的表结构
SQL DSL SQL是es提供的JSON风格的请求语句,用来操作es,实现CRUD

elasticsearch与数据库的关系:

  • Mysql:数据库负责事务类型操作,可以确保数据的安全和一致性
  • elasticsearch:负责海量数据的搜索、分析、计算

10分钟快速入门

安装elasticsearch

1.部署单点es(docke安装es

2.部署kibana(docker安装kibana

3.安装ik分词器

分词器

es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但 默认的分词规则对中文处理并不友好。

我们在kibana的DevTools中测试:

clike 复制代码
POST /_analyze
{
    "analyzer": "standard",
    "text": "黑马程序员 学习java太棒了! "
}

结果:黑,马,程,序,员,学,习,java,太,棒,了
语法说明:

  • POST:请求方式
  • / _analyze:请求路径,这里省略了http://192.168.150.101:9200,有kibana帮我们补充
  • 请求参数,json风格
  • analyzer:分词器类型,这里是默认的standard分词器
  • text:要分词的内容

问题:英文分词有空格间隔,但中文分词要根据语义分词有难度

处理中文分词一般采用ik分词器

下载IK分词器 https://github.com/medcl/elasticsearch-analysis-ik/releases
tip: 里面是各种jar包,下载完成后放在es的plugins目录下,重新启动es

ik分词器

中文分词往往需要语义分析,比较复杂,这就需要用到中文分词器,例如ik分词器。ik分词器是林良益在2006年开源发布的,其采用的正向迭代最细粒度切分算法一直沿用至今。

安装方式也比较简单,将分词器放入elasticsearch的插件目录即可

docker安装ik分词器(推荐离线安装,在线安装比较慢

clike 复制代码
#1.查看数据卷目录
docker volume inspect es-plugins
#2.解压缩分词器安装包,上传解压后的ik目录到es-plugins挂在的目录
#3.重启容器
docker restart es
#4.查看es日志
docker logs -f es

ik分词器包含两种模式

  • ik_smart:最少切分 ==> 黑马,程序员,学习,java,太棒了
  • ik_max_work:最细切分 ===> 黑马,程序员,程序,员,学习,java,太棒了,太棒,了

ik分词器-扩展字典和停用字典

要拓展和停用ik分词器的词库,只需要修改一个ik分词器目录中的**/var/lib/docker/volumes/es-plugins/_data/ik/config**目录中的IkAnalyzer.cfg.xml文件:

二、 索引库操作

mapping映射属性
mapping是对索引库中文档的约束

参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.12/dynamic-mapping.html

  • mapping补全属性:serach_analyzer(搜索分词器)
  • type扩展属性:Completion(补全)

索引库的CRUD

索引库操作有哪些?

  • 创建索引库:PUT /索引库名
  • 查询索引库: GET /索引库名
  • 删除索引库:DELETE /索引库名
  • 修改索引库之添加字段: PUT /索引库名/_mapping

创建索引库

clike 复制代码
PUT /heima
{
    "mappings": {
        "properties": {
            "info":{
                "type": "text",
                "analyzer": "my_analyzer",
                "search_analyzer": "ik_smart"    
            },
            "email":{
                "type": "keyword",
                "index": false
            },
            "name":{
                "type":"object",
                "properties": {
                    "firstName":{
                        "type":"keyword"
                    },
                    "lastname":{
                        "type":"keyword"
                    }
                }
            }
        }
    },
    "settings": {
        "analysis": {
          "analyzer": { 
            "my_analyzer": { 
              "tokenizer": "ik_max_word",
              "filter": "py"
            }
          },
          "filter": {
             "py": { 
                  "type": "pinyin",
                  "keep_full_pinyin": false,
                  "keep_joined_full_pinyin": true,
                  "keep_original": true,
                  "limit_first_letter_length": 16,
                  "remove_duplicated_term": true,
                  "none_chinese_pinyin_tokenize": false
             }
          }
        }
  }
}

ES中通过Restful请求操作索引库、文档。请求内容用DSL语句来表示。创建索引库和mapping的DSL语法如下:

修改索引库

三 、文档操作

创建文档

clike 复制代码
POST  /索引库名/_doc       #使用系统生成id
POST  /索引库名/_create/1   #使用指定id, 存在则创建失败
POST  /索引库名/_doc/1  #使用指定id,不存在创建,存在更新(版本递增)

请求体数据:

clike 复制代码
POST /heima/_doc/1
{
    "email" : "[email protected]",
    "info" : "黑马程序员java老师",
    "name":{
        "firstName":"云",
        "lastName":"赵"    
    }
}

查询文档

clike 复制代码
GET  /索引库名/_doc/1

查询单个文档

clike 复制代码
GET  /索引库名/_search

查询全部文档,条件查询

clike 复制代码
GET  /索引库名/_search?q=info:java

删除文档

clike 复制代码
DELETE /索引库名/_doc/1

#查询出所有数据并清空
POST hotel/_delete_by_query
{
  "query": {
    "match_all": {}
  }
}

修改文档

1.修改文档(全量修改,会删除旧文档,添加新文档):能做新增,也能做修改

clike 复制代码
PUT  /索引库名/_doc/文档id
{
    "name" : "springboot",
    "type" : "springboot",
    "description":"springboot"
}

2.修改文档( 部分修改)

clike 复制代码
POST  /索引库名/_update/1
{
   "doc" : {
        "name" : "springboot"
    }
 }

批量处理

ElasticSearch中允许通过一次请求中携带多次文档操作,也就是批量处理,语法格式如下:

  • _index :指定要删除的索引库名
  • _id :指定要操作的文档id
相关推荐
BenBen尔17 分钟前
spark的堆外内存,是在jvm内还是操作系统内存内?
大数据·jvm·hadoop·spark
EasyDSS1 小时前
WebRTC实时通话EasyRTC嵌入式音视频通信SDK,构建智慧医疗远程会诊高效方案
大数据·网络·网络协议·音视频
AWS官方合作商2 小时前
应对海量数据归档难题?AWS Glacier 的低成本冷存储解决方案实践指南
大数据·云计算·aws
IT成长日记3 小时前
Hadoop文件操作指南:深入解析文件操作
大数据·hadoop·分布式
派可数据BI可视化4 小时前
数据中台、BI业务访谈(三):如何选择合适的访谈对象
大数据·信息可视化·数据挖掘·数据分析·商业智能bi
AI糊涂是福4 小时前
数字政府与智慧城市区别报告分析
大数据·人工智能·机器学习·架构·智慧城市
风生水气4 小时前
在supabase中实现关键词检索和语义检索
后端·搜索引擎
搞程序的心海5 小时前
Flink DataStream API深度解析(Scala版):窗口计算、水位线与状态编程
大数据·flink·scala
得物技术6 小时前
如何合理规划Elasticsearch的索引|得物技术
elasticsearch
我爱布朗熊7 小时前
5.Elasticsearch - Spring Data 框架
spring·elasticsearch·jenkins