【学习笔记】ElasticSearch(ES)基本概念和语句学习笔记_es 建表-程序员宅基地

技术标签: elasticsearch  后端开发  搜索引擎  big data  

一、ES概念

1. ES

ElasticSearch又称ES,是一个开源的高扩展的分布式全文搜索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。Elasticsearch是面向文档型数据库,一 条数据在这里就是一个文档。

全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

下图是ES和MySQL中一些概念的对应,其中type的概念已经被弱化,在ES 7.X之后被删除。
在这里插入图片描述

2. index(索引)

一个索引就是一个拥有几分相似特征的文档的集合。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除(CRUD)的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。相当于MySQL中的数据库。

3. type(类型)

一个索引中可以定义一种或多种类型。一个类型是索引的一个逻辑上的分类/分区,其语义完全由你来定。相当于MySQL中的表。

4. document(文档)

一个文档是一个可被索引的基础信息单元,也就是一条数据。相当于MySQL中的一条记录。

5. field(字段)

相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。相当于MySQL中表的字段。

6. mapping(映射)

mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等。相当于MySQL中的建表过程中设置默认值、主外键、索引等。

7. cluster(集群)

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。

8. node(节点)

一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。

9. shard(分片)

Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。它允许水平分割/扩展你的内容容量,或者在多个节点上上进行分布式的、并行的操作,进而提高性能/吞吐量。

分片很重要,主要有两方面的原因:

  • 允许你水平分割扩展你的内容容量
  • 允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量

10. replicas(副本)

Elasticsearch允许你创建分片的一份或多份备份,这些备份叫做复制分片,或者直接叫副本。

复制分片之所以重要,有两个主要原因:

  • 在分片/节点失败的情况下,提供了高可用性

  • 扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行

11. allocation(分配)

将分片分配给某个节点的过程,包括分配主分片或者副本。如果是副本,还包含从主分片复制数据的过程。这个过程是由master节点完成的。

二、ES原理

1. 倒排索引

(1) 正向索引

词条:索引中最小存储和查询单元
词典:字典,词条的集合,具体实现有B+树、HashMap等

Elasticsearch使用一种称为倒排索引的结构,它适用于快速的全文搜索。有倒排索引,肯定会对应有正向索引(forward index)。倒排索引也称反向索引(inverted index)。所谓的正向索引,就是搜索引擎会将待搜索的文件都对应一个文件ID,搜索时将这个ID和搜索关键字进行对应,形成K-V对,然后对关键字进行统计计数。
img

(2) 倒排索引

但是互联网上收录在搜索引擎中的文档的数目是个天文数字,这样的索引结构根本无法满足实时返回排名结果的要求。所以,搜索引擎会将正向索引重新构建为倒排索引,即把文件ID对应到关键词的映射转换为关键词到文件ID的映射,每个关键词都对应着一系列的文件,这些文件中都出现这个关键词。
img

(3) 倒排索引的不可改变性

早期的全文检索会为整个文档集合建立一个很大的倒排索引并将其写入到磁盘。 一旦新的索引就绪,旧的就会被其替换,这样最近的变化便可以被检索到。倒排索引被写入磁盘后是不可改变的,它永远不会修改。

优点

  • 不需要锁。如果你从来不更新索引,你就不需要担心多进程同时修改数据的问题。

  • 一旦索引被读入内核的文件系统缓存,便会留在哪里,由于其不变性。只要文件系统缓存中还有足够的空间,那么大部分读请求会直接请求内存,而不会命中磁盘。这提供了很大的性能提升。

  • 其它缓存(像filter缓存),在索引的生命周期内始终有效。它们不需要在每次数据改变时被重建,因为数据不会变化。

  • 写入单个大的倒排索引允许数据被压缩,减少磁盘IO和需要被缓存到内存的索引的使用量。

缺点:由于其不可改变,所以如果你需要让一个新的文档可被搜索,你需要重建整个索引。这要么对一个索引所能包含的数据量造成了很大的限制,要么对索引可被更新的频率造成了很大的限制。

(4) 动态更新索引

如何在保留不变性的前提下实现倒排索引的更新?答案是用更多的索引。通过增加新的补充索引来反映新近的修改,而不是直接重写整个倒排索引。每一个倒排索引都会被轮流查询到,从最早的开始查询完后再对结果进行合并。

Elasticsearch基于Lucene,这个java库引入了按段搜索的概念。每一段本身都是一个倒排索引,但索引在 Lucene 中除表示所有段的集合外,还增加了提交点的概念——一个列出了所有已知段的文件。

(5) 文档搜索/更新/删除

当一个查询被触发,所有已知的段按顺序被查询。词项统计会对所有段的结果进行聚合,以保证每个词和每个文档的关联都被准确计算。这种方式可以用相对较低的成本将新文档添加到索引。

段是不可改变的,所以既不能从把文档从旧的段中移除,也不能修改旧的段来进行反映文档的更新。取而代之的是,每个提交点会包含一个.del 文件,文件中会列出这些被删除文档的段信息。当一个**文档被“删除”**时,它实际上只是在 .del 文件中被标记删除。一个被标记删除的文档仍然可以被查询匹配到,但它会在最终结果被返回前从结果集中移除。

文档更新也是类似的操作方式:当一个文档被更新时,旧版本文档被标记删除,文档的新版本被索引到一个新的段中。可能两个版本的文档都会被一个查询匹配到,但被删除的那个旧版本文档在结果集返回前就已经被移除。

2. 文档分析

(1) 分析器

分析器实际上是将三个功能封装到了一个包里:

  • 字符过滤器:首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉 HTML,或者将 & 转化成 and。

  • 分词器:其次,字符串被分词器分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。

  • Token 过滤器:最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化Quick ),删除词条(例如, 像 a, and, the 等无用词),或者增加词条(例如,像jump和leap这种同义词)

(2) 分析器类型

  • 标准分析器:标准分析器是Elasticsearch 默认使用的分析器。它是分析各种语言文本最常用的选择。它根据Unicode 联盟定义的单词边界划分文本。删除绝大部分标点。最后,将词条小写。

  • 简单分析器:简单分析器在任何不是字母的地方分隔文本,将词条小写。

  • 空格分析器:空格分析器在空格的地方划分文本。

  • 语言分析器:特定语言分析器可用于很多语言。它们可以考虑指定语言的特点。例如,英语分析器附带了一组英语无用词(常用单词,例如and或者the ,它们对相关性没有多少影响),它们会被删除。由于理解英语语法的规则,这个分词器可以提取英语单词的词干。

  • 自定义分析器:虽然Elasticsearch带有一些现成的分析器,然而在分析器上Elasticsearch真正的强大之处在于,你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单元过滤器来创建自定义的分析器。一个分析器就是在一个包里面组合了三种函数的一个包装器,三种函数按照顺序被执行:

    • 字符过滤器:字符过滤器用来整理一个尚未被分词的字符串。

    • 分词器:一个分析器必须有一个唯一的分词器。分词器把字符串分解成单个词条或者词汇单元。

    • 词单元过滤器:经过分词,作为结果的词单元流会按照指定的顺序通过指定的词单元过滤器。词单元过滤器可以修改、添加或者移除词单元。

三、操作类型和操作对象

1. GET/PUT/POST/DELETE

ES中主要有GET/PUT/POST/DELETE这四种操作,分别表示查询、更新或创建、创建、删除操作。其中PUT和POST的区别是:PUT在插入新数据的时候需要指定_id,而POST则不需要,这个_id是ES中文档的唯一标识。换种说法,PUT是幂等的,即多次执行的结果相同,而POST不是幂等的,多次执行会插入多条数据。

2. _mapping/_settings/_search/_count/_doc

_mapping/_settings/_search/_count/_doc分别是对映射、索引设置、查询记录值、查询记录数、查询文档信息的操作,具体看下文中的列子。

四、索引/字段/文档等操作语句

1. 索引操作

(1) 创建索引

# 创建索引的设置信息,也可以直接创建索引字段,此时设置信息取默认值
PUT index_name
{
    
  "settings" : {
    
    "index" : {
    
      "refresh_interval" : "60s",
      "number_of_shards" : "3",
      "translog" : {
    
        "durability" : "async"
      },
      "max_result_window" : "10000000",
      "unassigned" : {
    
        "node_left" : {
    
          "delayed_timeout" : "30m"
        }
      },
      "number_of_replicas" : "1"
    }
  }
}

其中number_of_shards为分片数

(2) 查询索引设置信息

# 查询索引设置信息
GET trade_bill_detail/_settings

(3) 删除索引

# 删除索引
DELETE trade_bill_detail

2. 字段操作

(1) 为索引添加字段

# 为索引添加新字段
PUT trade_bill_detail/_mapping
{
    
	"properties" : {
    
        "begin_time" : {
    
          "type" : "date"
        },
        "expense_begin_time" : {
    
          "type" : "keyword"
        },
        "account_id" : {
    
          "type" : "long"
        },
        "price_new" : {
    
          "type" : "double"
        }
    }
}

(2) 查询字段信息

# 查看索引的所有字段
GET trade_bill_detail/_mapping

3. 文档操作

(1) 查询文档信息

# 查询文档信息,1798023是文档的id
GET trade_bill_detail/_doc/1798023

4. 其他操作

(1) 查询数据总量

# 查询数据总量,以kb为单位。用来在进行数据同步时查询同步情况
GET _cat/indices/trade_bill_detail?v&h=index,docs.count,store.size&bytes=kb

五、查询语句

1. 相等查询

# 相等条件查询
GET trade_bill_detail/_search
{
    
  "query": {
    
    "match": {
    
      "BillID": "Bill7037412215733195052"
    }
  }
}
# 相等条件查询
GET trade_bill_detail/_search
{
    
  "query": {
    
    "bool": {
    
      "must": [
        {
    
          "match": {
    
            "ID": "1648022"
          }
        }
      ]
    }
  }
}

2. 不等查询

# 不等条件查询
GET trade_bill_detail/_search
{
    
	"query": {
    
		"bool": {
    
			"must_not": {
    
			  "match": {
    
			    "DataDisplayRule": "1"
			  }
			}
		}
	}
}

3. 模糊查询

# 模糊查询
GET trade_bill_detail/_search
{
    
  "query": {
    
    "wildcard": {
    
      "BillID": {
    
        "value": "*Bill7025695920478818604*"
      }
    }
  }
}

4. 多字段查询

# 对多个字段执行相同的查询
GET trade_bill_detail/_search
{
    
  "query": {
    
    "multi_match":{
    
      "query": "0",
      "fields": ["Price","PriceNew"]
    }
  }
}

5. 排序

# 排序
GET trade_bill_detail/_search
{
    
  "query": {
    
    "match_all": {
    }
  },
  "sort": [
    {
    
      "ID": {
    
        "order": "desc"
      },
      "BeginT": {
    
        "order": "asc"
      }
    }
  ]
}

6. 集合查询

# 集合查询,in条件查询
GET trade_bill_detail/_count
{
    
  "query": {
    
    "terms": {
    
      "ID": [1492462,1648018,1648022,1692420,1692421,1692422,1692423,1692424]
    }
  }
}

7. 记录数查询

# 搜索某字段符合特定条件的记录数
GET trade_bill_detail/_count
{
    
  "query": {
    
    "match": {
    
      "DataDisplayRule": "1"
    }
  }
}
# 查询总记录数
GET trade_bill_detail/_count

8. 大于小于查询

# range查询,gte是大于等于,gt是大于,lte是小于等于,lt是小于
GET index_name/_search
{
    
  "query":{
    
    "range":{
    
      "Price":{
    
        "gte": 10,
        "lte": 30
      }
    }
  }
}

9. 综合查询

GET index_name/_search
{
    
    "from":0,
    "query":{
    
        "bool":{
    
            "filter":[
                {
    
                    "range":{
    
                        "BeginTime":{
    
                            "from":"2021-01-01T00:00:00+08:00",
                            "include_lower":true,
                            "include_upper":true,
                            "to":null
                        }
                    }
                },
                {
    
                    "range":{
    
                        "BeginTime":{
    
                            "from":null,
                            "include_lower":true,
                            "include_upper":false,
                            "to":"2022-01-01T00:00:00+08:00"
                        }
                    }
                },
                {
    
                    "term":{
    
                        "BillType":"normal"
                    }
                },
                {
    
                    "term":{
    
                        "SubjectNo":"3423"
                    }
                },
                {
    
                    "terms":{
    
                        "DataDisplayRule":[
                            "1",
                            "3"
                        ]
                    }
                },
                {
    
                    "bool":{
    
                        "should":[
                            {
    
                                "bool":{
    
                                    "filter":{
    
                                        "wildcard":{
    
                                            "BillProperty":{
    
                                                "wildcard":"*system*"
                                            }
                                        }
                                    }
                                }
                            },
                            {
    
                                "bool":{
    
                                    "filter":{
    
                                        "wildcard":{
    
                                            "BillProperty":{
    
                                                "wildcard":"*orderNew*"
                                            }
                                        }
                                    }
                                }
                            }
                        ]
                    }
                },
                {
    
                    "bool":{
    
                        "should":[
                            {
    
                                "bool":{
    
                                    "filter":{
    
                                        "term":{
    
                                            "OrderNo":"Bill7025276297373585708"
                                        }
                                    }
                                }
                            },
                            {
    
                                "bool":{
    
                                    "filter":{
    
                                        "term":{
    
                                            "BillID":"Bill7025276297373585708"
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            ]
        }
    },
    "size":10,
    "sort":[
        {
    
            "BeginTime":{
    
                "order":"desc"
            }
        },
        {
    
            "InstanceNo":{
    
                "order":"asc"
            }
        },
        {
    
            "ID":{
    
                "order":"asc"
            }
        }
    ],
    "track_total_hits":true
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zuzhiang/article/details/122641238

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签