ES入门指南

(十)ES 入门教程 本文为学习笔记,主要用于记录本人学习过程。部分内容为转载!!!!. 1、 ElasticSearch介绍 1.1 介绍 官方网址:https://www.elastic.co/cn/products/elasticsearch Github:https://github.com/elastic/elasticsearch 总结: 1、elasticsearch是一个基于Lucene的高扩展的分布式搜索服务器,支持开箱即用。 2、elasticsearch隐藏了Lucene的复杂性,对外提供Rest 阅读详情

前言

  1. 本文章适用于未接触ES或接触较少的中高级开发工程师,以较低的学习成本,快速学习ES并在生产中应用为核心目的

  2. 本文章主要以实战维度展开,在不影响数据安全以及基本的性能危机的前提下,不会过多的涉及深层次的底层原理(但也会涉及一些基本的原理,防止出现类似功能分辨不清导致系统性能受到极大的损耗的生产事故)

  3. 本文章借鉴了多个ES相关文档以及书籍《ES权威指南》,同时也进行了很多加工处理,例如: 横向DB对比、生涩知识点拆解为更通俗易懂的语言、以实战为主的知识点汇总、使用不当导致的风险点预知、涉及的编程思想等。希望能对大家在ES的学习上起到一定帮助。

环境

  1. jdk - v1.8

  2. ES - v7.x

目录

  1. 使用场景

  2. 存储结构

  3. 常用语句

  4. API

  5. 索引

  6. 映射

  7. 更新

  8. 查询

  9. API查询

  10. DSL查询

使用场景

  1. 数据库ES、Mysql、Mongo等,核心是围绕CRUD。其中各DB的核心特性又取决于其存储结构。这里通过类比的方式来阐述ES的使用场景

  2. Mysql核心存储结构是B+树,擅长范围查询(因B+树数据存储在叶子节点并用链表的方式相互关联,有利于做范围类查询操作)

  3. Mongo核心存储结构是B树,擅长单数据查询(因B树任意节点都可以存储数据,这样在根据条件查询一条数据时,就会比mysql的随机IO次数平均值小)

  4. ES核心存储结构是倒排索引(倒排索引原理后续会讲到),由于是属于重度空间换时间结构,所以在合理使用的前提下(这里特指结构化查询和过滤),范围、单数据等查询都具有不错的性能表现,但是相对的更新数据成本会更高。

  5. 综上所述,ES更适合写少读多的场景。并且对各种复杂查询都有良好的支持。

存储结构

  1. ES使用的是倒排索引,和正排索引通过key查询value不同,倒排索引是通过value反向查询key。

  2. 例如,当进行关键词查询时,如果是正向索引需要扫描索引库中的所有文档,找到所有包含关键词的文档。很显然这样性能会成为问题。而倒排索引则是根据关键词去寻找对应文档。每个关键词都对应这一系列文档,这样只要建立了该关键词的索引,就可以避免全索引库扫描的方式来进行关键词查询。

  3. 那么ES又是如何生成索引的呢,举个例子,这里有两个文档,1: “小红明天去上学”,2: “小白明天不去上学”,这时ES在添加数据时,会进行分词从而得到“小红”、“小白”、“明天”、“明天”、“去”、“不去”、“上学”,“上学”各词组。然后我们会发现,有2个明天和2个上学。那么这个时候ES会将各词组当作索引项,对应的是该词组出现的文档,例如:

小红: 文档1

小白: 文档2

明天: 文档1、文档2

...

这样就生成了倒排索引,这种索引结构,在2例的场景下可以极大的提高搜索性能。

常用语句(基于kibana)

API

  1. Java Api

  2. 基于HTTP协议,以JSON为数据交互格式的RESTful API

索引(index)

  1. ES中的索引(index)类比关系型数据库中table的概念(5.0版本是以type对应关系型数据库 table的概念,7.0后取消了多type概念,最多一个,建立index时如果不设置会默认创建一个type且最多一个type)

  2. 建立索引: PUT /{index_name} (不可以有大写)

映射(mapping)

  1. ES中的映射能力主要是为了给字段设定类型。虽然ES可以在索引有新字段的文档时会自动基于json类型规则生成映射,但是为了防止查询混乱的情况,我们一般会选择手动建立映射。例如: 当索引一个带有引号的数字”22”,这时他将会被映射为string类型。如果这时字段已经被映射为long类型,es将会尝试转换字符串为long,并在失败时会抛出异常。

  2. 建立映射语句:

      PUT /{index_name}
      {
        "mappings": {
          "properties": {
            "name": {
              "type": "text"
            },
            "age": {
              "type": "integer"
            }
          }
        }
      }

  字段释义:
    mappings, 映射
    properties, 特性定义
    type, 字段类型

  PS: 此处还可设置分词器插件等相关属性

更新

添加文档: POST

_index、_type、_id三者唯一确定一个文档,所以想要保证文档是新加入的,最简单的方式是使用POST方法让ES自动生成唯一_id(type 7.0后默认为_doc)

         POST /{index_name}/_doc
         {
           "studentName": "小明",
           "age": 22
         }

如果想自定义ID则可以使用_create关键字(只有在index+type+id均不存在时才会执行成功)

         PUT /{index_name}/_doc/{id}/_create
         {
           "studentName": "小红",
           "age": 22
         }

  1. 更新文档:

全局更新: PUT, 在ES中,文档不能通常意义上的局部修改,只可以通过重建索引或者替换来实现文档更新,实现过程如下:

  1. 从旧文档中检索JSON

  2. 修改它

  3. 删除旧文档

  4. 索引新文档

         PUT /{index_name}/_doc/{id}
         {
           "studentName": "小白",
           "age": 12
         }

局部更新: POST, 在使用层次ES提供了局部更新的能力,但是在ES内部中,依然遵循着上述的四个步骤,不过即便是这样,也一定程度上节约了网络IO和解决了并发问题(换句话说可以理解为ES将局部更新做了原子化处理)。因为如果没有这个能力,我们想要实现局部更新就不得不先将文档查询出来,然后将修改好的数据再通过PUT API请求发送到ES。

         POST /user/_doc/1/_update
         {
           "doc": {
             "name": "李四"
           }
         }
         PS: doc为type值,由于7.0后取消了多type机制,所以当没有设置type时,这里默认为doc

查询

HTTP查询语句部分:

根据索引名称、类型和文档ID查询:

GET /{index_name}/_doc/{id}

1. index_name: 索引名称
2. type: 类型(7.0版本后与index_name为1对1关系)
3. id: 文档id

查询一个索引下的所有数据:

GET /{index_name}/_doc/_search
PS: _search:标记为查询操作的关键字,添加此关键字后,可进行更细粒度的查询操作。

条件查询

在请求中依旧使用 _search 关键字,然后将查询语句传递给参数 q= 。这样就可以得到所有field_name为field_value的结果.

GET /{index_name}/_doc/_search?q={field_name}:{field_value}

结构化查询和结构化过滤(DSL语句):

  1. 结构化查询:查询能力更强,具有相关性分析能力,整体查询原理更为动态,但是因为会实时计算相关性、分析等行为,无法进行缓存操作,导致性能相对较慢

  2. 结构化过滤:进行精确相等性匹配过滤然后存入内存,因为是完全基于索引并且使用了缓存,所以在大量级场景下具有稳定的性能。

  3. 使用建议:原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句

常用查询语句和过滤语句:

query: _search关键字中DSL语句最外层关键字,且_search下只能有query

         GET /{index_name}/_doc/_search
         {
           "query":{
             ...
           }
         }

term - 过滤类语句:主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)

         GET /{index_name}/_doc/_search
         {
           "query":{
             {
               "term": {
                 "age": 26
               }
             }
           }
         }

terms - 过滤类语句: terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:

         GET /{index_name}/_doc/_search
         {
           "query": {
             "terms": {
               "age":[26, 33]
             }
           }
         }

range - 过滤类语句: 允许我们按照指定范围查找一批数据

         GET /{index_name}/_doc/_search
         {
           "query": {
              "range": {
                "age": {
                  "gte": 20,
                  "lt": 30
                }
              }
           }
         }
         PS:范围操作符包含: 
         gt: 大于
         gte: 大于等于
         lt: 小于
         lte: 小于等于

exists 和 missing - 过滤类语句: 可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的 IS_NULL 条件

         GET /{index_name}/_doc/_search
         {
           "query": {
             "exists": {
               "field": "name"
             }
           }
         }
         PS: 这两个过滤只是针对已经查出一批数据来,但是想区分出某个字段是否存在的时候使用。

bool - 过滤类语句: 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:

1. must:多个查询条件的完全匹配,相当于 and

2. must_not:多个查询条件的相反匹配,相当于 not 。

3. should:至少有一个查询条件匹配, 相当于 or 。

         GET /{index_name}/_doc/_search
         {
           "query": {
             "bool": {
               "must": {"term": {"studentName": "张三"}},
               "nust_not": {"term": {"age": 22}},
               "should": [
                 {"term": {"hasMan": true}},
                 {"term": {"hasMonitor": false}}
               ]
             }
           }
         }

match_all - 查询类语句: 可以查询到所有文档,是没有查询条件下的默认语句

GET /{index_name}/_doc/_search
{
  "query": {
    "match_all": {
      
    }
  }
}

match - 查询类语句: 匹配查询,全文(Fulltext)查询

不同于词条查询ES在处理全文查询时,会先对查询条件进行分析,然后根据分词插件做分词处理,最终以分词结果进行查询并返回查询结果。例如:

{
  "query": {
    "match": {
      "msg": "Hello world"
    }
  }
}

如上所述, 在执行"hello world"查询条件时,会先进行分析器进行分词得到小写的hello和world,然后默认会执行字段“msg”的值,在hello和world中包含任意一个,则返回的逻辑。当然,这个是“or”逻辑就也可以设置为“and”逻辑。

PS: 此处包含有三种类型的匹配查询(默认为布尔,上述就是布尔匹配查询类型的运行逻辑,由于此处展开讲内容量较大,涉及较多机制设定、原理等问题,入门指南不做讲解,后续进阶系列会详细描述):

布尔

短语

短语前缀

PS:需要注意的是,如果是做精确查询,因为过滤类语句会进行缓存,所以最好使用过滤类语句。

multi_match - 查询类语句: 允许你做 match 查询的基础上同时搜索多个字段

         {
           "query": {
             "multi_match": {
               "query": "123",
               "fields": [
                 "name",
                 "age"
               ]
             }
           }
         }

bool - 查询类语句: bool 查询与 bool 过滤相似,用于合并多个查询子句。不同的是, bool 过滤可以直接给出是否匹配成功, 而 bool 查询 要计算每一个查询子句的 _score (相关性分值)。(此处摘自: ES权威指南)

1. must:查询指定文档一定要被包含。

2. must_not:查询指定文档一定不要被包含。

3. should:查询指定文档,有则可以为文档相关性加分。

4. 以下查询将会找到 title 字段中包含 "how to make millions",并且 "tag" 字段没有被标为 spam。如果有标识为 "starred",或者发布日期为2014年之前,那么这些匹配的文档将比同类网站等级高

{
  "bool": {
    "must": {
      "match": {
        "title": "how to make millions"
      }
    },
    "must_not": {
      "match": {
        "tag": "spam"
      }
    },
    "should": [
      {
        "match": {
          "tag": "starred"
        }
      },
      {
        "range": {
          "date": {
            "gte": "2014-01-01"
          }
        }
      }
    ]
  }
}
PS: 如果 bool 查询下没有 must 子句,那至少应该有一个 should 子句。但是 如果有 must 子句,那么没 有 should 子句也可以进行查询。

查询与过滤条件的合并:

因为search API中只能包含query语句,所以我们需要用filtered来同时包含query和filter子句:

GET /{index_name}/_doc/_search
{
  "query": {
    "filtered": {
      "query": {
        "match": {
          "email": "business opportunity"
        }
      },
      "filter": {
        "term": {
          "folder": "inbox"
        }
      }
    }
  }
}
PS: 在混合使用时需要注意的是,我们很少用到的过滤语句中包含查询,保留这种用法只是为了语法的完整性。 只有在过滤中用到全文本匹配的时候才会使用这种结构。

Elasticsearch 入门及使用 一、前言 本文版本说明: ElasticSearch版本:7.7 (目前最新版) Kibana版本:7.7(目前最新版) ElasticSearch在实际生产里通常和LogStash,Kibana,FileBeat一起构成Elastic Stack来使用,它是这些组件里面最核心的一个。因此学好ElasticSearch的必要性不言而喻,但是由于ElasticSearch官方更新太过频繁且文档陈旧,同时在Linux下安装配置的过程较繁杂,不利于入门使用。 为了帮助大家快速入门 阅读详情

相关推荐

Elasticsearch基础教程:从入门到上手

Elasticsearch(简称ES)是一个分布式、RESTful风格的搜索引擎,支持全文检索、结构化查询、分析和近实时搜索。常用于日志分析、商品搜索、数据分析等场景。

遇见伯灵说的博客 1119

ES基础指令及原理

Elasticsearch 是一个基于 Apache Lucene 构建的分布式、RESTful 风格的搜索与分析引擎。它能够近乎实时地存储、检索和分析海量数据,通常作为应用程序的核心搜索组件或大数据分析平台的基础。全文搜索:在大量文本中快速找到最相关的内容(例如电商搜索、日志搜索)。结构化聚合分析:对数据进行统计、分组、求平均等运算(例如“过去一小时的错误日志数量”)。

2301_81831660的博客 683

如何学习ElasticsearchES):从入门到精通的完整指南

通过本文,我们提供了一个系统的学习路径,帮助你从零开始掌握Elasticsearch。无论你是新手还是有一定经验的开发者,都可以根据自己的情况选择合适的学习资源和实践项目,逐步深入理解Elasticsearch的强大功能。

Kenneth55的专栏 2243

ES基础入门

ElasticSearch基础入门

小知识吖 1万+

ES入门

文章目录1、ES是什么2、ES基本结构2.1、结构图2.2、基本概念2.3、和关系型数据库概念类比3、ES原理3.1、Node节点管理3.1.1、多节点集群方案3.1.2、协调节点3.1.3、节点故障转移3.2、shard分片原理3.2.1、文本可被搜索:分词器+倒排索引3.2.2、动态更新索引3.2.3、保证近实时的搜索3.2.4、持久化变更3.2.5、段合并3.3、ES并发控制原理3.4、原理小结 1、ES是什么 一个分布式实时文档存储,每个字段可以被索引和搜索 一个分布式实时分析搜索引擎 能胜任上百

weixin_44240370的博客 4846

Elasticsearch 入门指南:从零开始学搜索引擎

是一款基于 Lucene 的分布式搜索引擎,它不仅支持高效的全文检索,还能处理结构化数据的复杂查询。对于一个大三学生来说,掌握 Elasticsearch 的基础知识不仅能提升你的技术栈,还能为未来的实习或工作增添一份竞争力。通过本文的学习,相信你已经对 Elasticsearch 的核心概念、基本操作以及一些实用技巧有了初步的了解。在当今的信息时代,搜索功能几乎是每个应用程序的核心需求。无论是电商网站的商品搜索、社交媒体的内容检索,还是日志分析中的关键词查找,搜索都在发挥着不可或缺的作用。

Leaton的博客 1264

esElasticsearch) -- 入门指南

简介 ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。本质上是一个分布式nosql数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster......

阿华田的博客 3万+

OpenGL ES 入门指南

OpenGL ES (OpenGL for Embedded Systems) 是OpenGL的子集,专为移动设备和嵌入式系统设计。它是智能手机、平板电脑、游戏主机等设备上2D/3D图形渲染的标准API。

深之JohnChen的专栏 2417

Elasticsearch 导出器到Prometheus入门指南及问题解答

Elasticsearch Exporter 是一个由Go语言编写的Prometheus监控数据收集器,它专门用于从Elasticsearch集群中抓取各种指标并导出给Prometheus监控系统。通过此工具,你可以轻松地监控你的Elasticsearch实例的健康状态和性能指标。 ## 编程语言 - **主要编程语言**: Go ## 新手注意事项及解决步骤 ### 注意点1:正确配置El...

gitblog_07323的博客 446

ESElasticsearch入门指南

版权声明:原创文章 欢迎参考 请勿抄袭 https://blog.csdn.net/aA518189/article/details/86064737 </div> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/temp...

花语无痕的博客 2169

SEO搜索引擎优化 入门指南

搜索引擎优化 (SEO) 是提高一个网站在搜索引擎中的排名(能见度)的过程。如果网站能够在搜索引擎中有良好的排名,有助于网站获得更多的流量。SEO主要研究搜索引擎是工作的原理,是什么人搜索,输入什么搜索关键字。优化一个网站,可能涉及内容的编辑,增加关键字的相关性。推广一个网站,可以增加网站的外链数量。

suliuzhen的博客 675

Elasticsearch 快速入门指南

Elasticsearch 是一个基于 Lucene 的开源分布式搜索和分析引擎,具有分布式、实时性、全文检索等特点。其核心概念包括索引、类型、文档、字段等,与关系型数据库中的数据库、表、行、列等概念相对应。安装 Elasticsearch 可通过下载并解压安装包,启动后通过 RESTful API 进行验证。基本操作包括创建索引、添加文档、查询文档、更新文档、删除文档和删除索引。Elasticsearch 的核心功能是搜索,支持丰富的查询功能,如基本查询、匹配查询等。通过这些操作,用户可以高效地管理和检索

Luck_ff的博客 2285

二、Elasticsearch入门必读指南:到底选择哪个ES版本更合适

为什么写这篇,一是没人讲,二是网上很多同学分享ES相关知识、问题排查等,很多都不讲版本,导致新手在技术选型时不知道选择什么版本,更多的是问题排查时看半天文章却发现版本对不上。所以想通过这篇文章告诉你2024年了,选择什么版本更合适。

caizi1288的专栏 1万+

OpenGL ES入门指南(一)

想学OpenGL?想在手机端上实现酷炫效果?那还不快来了解OpenGL ES

qq_27011813的博客 2923

elastic 概述

ES的介绍ES是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。Lucene:Lucene本身就是一个搜索引擎的底层。分布式:ES主要是为了突出他的横向扩展能力。全文检索:将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配的内容。(倒排索引)RESTful风格的WEB接口。

weixin_60934893的博客 2121

ES(Elasticsearch)安装教程

解释为什么要学Elasticsearch? ES 下载安装和配置,建议使用Docker安装

极客星云-CSDN博客 1万+

ElasticSearch篇——初始、认识、拿下ElasticSearch,一篇文章带你入门ES,涵盖ES概念,对比Solr,ES核心概念以及常见工具head、kibana安装和使用,保姆级教程!!!

一、学习背景曾经,如果我们在网页上查询某些数据,在输入框中输入部分内容,后台默认可能是通过SQL的模糊查询进行操作的。但是在现今的大数据时代,有几百万条数据,那么常规的模糊查询就非常的缓慢了,慢慢的演进出来了索引,但是还是达不到大数据的要求。那么,就有必要学习一款分布式全文搜索引擎。那么ElasticSearch主要功能就是搜索,如果在某个网站上需要用到搜索功能基本上都是用的ElasticSearch二、ES的起源。

我热爱学习,也乐于分享。无论是科技前沿的洞见,还是生活中的小技巧,我都会在这里与你分享。我相信,知识就是力量,而分享则能让这份力量得到更好的传递。 7万+

ES快速入门

ES作为一个索引及搜索服务,对外提供丰富的REST接口,快速入门部分的实例使用head插件来测试,目的是对ES 的使用方法及流程有个初步的认识。 1 创建索引库 ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档。它就相当于 MySQL中的表,或相当于Mongodb中的集合。 关于索引这个语: 索引(名词):ES是基于Lucene构建...

笙箫的博客 1608
上一篇: 基于mybatis的敏捷框架(整合spring-boot)
下一篇: 工作计划模型
阿强 - RS
博客等级 码龄9年 4粉丝 · 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值