当前位置:首页 > 日常学习 > 正文内容

ElasticSearch学习笔记

UzJu2年前 (2022-04-16)日常学习640

ElasticSearch学习笔记

一、关系型数据库与非关系学数据库类比

关系型

Relational DB -> DataBases -> Tables -> Rows -> Columns

Elasticsearch

Elasticsearch -> Indices -> Types -> Documents -> Fields

Es如同SQL一样,有一套自己的查询语句,DSL查询

二、Elasticsearch增删改查

1、增

指定ID的情况下

PUT users/_doc/1
{
    "username": "wupx",
    "age": "18"
}

Create支持两种方式,一种是指定文档ID创建文档,另一种是让ES自动生成文档ID

自己指定文档ID创建文档,需要考虑ID的均衡性,避免产生分配不均衡的问题,Es的HASH函数会确保文档ID被均匀分配到不同的分片。

返回包中的_version字段,每一次操作都会加1,这是一个锁的机制,当并行修改文档的时候,更新的版本号比文档当前的版本号小时就会报错,不允许修改。

创建文档的时候,如果索引不存在,ES会自动创建对应的Index和Type

不指定ID的情况下

不指定id创建文档,HTTP请求也会变为PSOT

POST users/_doc
{
    "username": "huxy",
    "age": "18"
}

index和Create区别为:如果文档不存在,就索引新的文档,否则现有文档就会被删除,新的文档被索引版本信息_version+1

2、查

使用GET犯法,只需要GET 索引名/文档名/文档ID

GET users/_doc/1

在返回信息中_index为索引,_type为类型,_id为文档id,_version为版本信息,_source存储了文档的完整原始数据。

3、改

Update方法采用HTTP POST,在请求体重必须指名doc,在把具体文档提供在HTTP的body里,update和index犯法不同,update方法不会删除原来的文档,而是真正的数据更新

POST users/_update/1
{
    "doc": {
        "job": "coder",
        "message": "hello world"
    }
}

4、删

只需要把HTTP的方法换成Delete即可

Delete 索引名/_doc/文档id

三、Elasticsearch查询常见方法

Tips:在所有语法后面加上?pretty=true,格式化显示

1、查询所有索引及其容量

GET _cat/indices

2、查询某一个索引的映射结构

GET 索引名/_mapping

3、查询所有的相同前缀索引,通配符匹配

GET sec*/_search

4、查询所有索引模板

GET _template

5、查询具体索引模板

GET _template/模板名

6、查询集群健康状态

GET _cluster/health

7、查询所有节点

GET _cat/nodes

8、查询索引及分片的分布

GET _cat/shards

9、查询所有插件

GET _cat/plugins

四、Elasticsearch高级查询常见方法

1、查询某个索引的全部数据

GET /index/type/_search
{
    "query": {
        "match_all": {}
    }
}

2、根据某一字段精确查询

GET /index/type/_search
{
    "query": {
        "term" : {"字段名": "值"}
    }
}

3、根据某一字段模糊匹配

GET /index/tpe/_search
{
    "query": {
        "match": {"字段名": "值"}
    }
}

4、根据某一字段值进行范围查找

GET /index/type/_search
{
    "query":{
        "range": {
            "age": {"gte": 15, "lte": 25}
        }
    }
}

gte是大于等于 lte是小于等于

5、根据条件进行过滤查询

GET /index/type/_search
{
    "query":{
        "bool":{
            "filter": {
                "term": {"字段": "值"}
            }
        }
    }
}

五、DSL查询方法

DSL查询使用Json格式的请求体与Elasticsearch交互

DSL查询主要包括两种类型的查询语句

  • 叶子查询语句:用于查询特殊字段的特殊值,例如:match,term,range等
  • 复合查询语句:可以合并其他的叶子查询或复合查询,从而实现非常复杂的查询逻辑

1、基本语法

使用DSL查询,需要用query参数

GET /_search
{
    "query": <quer clause>
}

没有查询条件的查询,就是空查询,他会匹配所有的文档

GET /_search
{
    "query": {}
}

以上语句等价于

GET /_search

基本查询案例

使用match查询full_name字段包含john的记录

GET /_search
{
    "query": {
        "match": {
            "full_name": "john"
        }
    }
}

查询与过滤

DSL查询根据使用目的的不同分为两种类型

  • 上下文查询(Query Context),简称查询
  • 上下文过滤(Filter Context),简称过滤

查询Query

在上下文查询语境中,查询语句会询问文档与查询语句的匹配出程度,此外,它还会判断文档是否匹配并计算相关性评分_scoure的值

过滤Filter

在上下文过滤语境中,查询语句主要解决文档是否匹配的问题,而不会在意匹配程度,过滤主要用于结构化的数据

一般来说,过滤语句比查询语句的执行效率更高,因为它不用计算文档的相关性评分Score

全文搜索或需要用到相关性评分Score的场景采用查询Query,其他的全部用过滤Filter

GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}

全文查询

全文查询语句通常用于全文本字段的查询

match

查询可操作文本,数值和日期类型的数据,分期它们并构建查询语句

实例:查询full_name字段包含John或smith的文档

GET /_search
{
    "query" : {
        "match" : {
            "full_name" : "John Smith"
        }
    }
}

Tips:Elasticsearch会先使用分析器分析John Smith为两个独立的项,然后再去构建查询,这里的full_name字段可以替换为任何你想要查询的字段,甚至是_all字段

match属于boolean的类型,也就是说,分析器会对提供的查询文本进行分析并构建boolean查询语句,由match构建的boolean查询语句默认是逻辑或or,当然可以通过operator参数来改变这个默认行为

GET /_search
{
    "query": {
        "match" : {
            "full_name" : {
                "query" : "John Smith",
                "operator" : "and"
            }
        }
    }
}

说明: full_name 是字段名称,query 参数的值是提供的查询文本,operator 参数用于设置 match 的逻辑(or 还是 and)。

扫描二维码推送至手机访问。

版权声明:本文由UzJu的安全屋发布,如需转载请注明出处。

SQL ERROR: ERROR 1105 (HY000): XPATH syntax error: '~root@localhost'

本文链接:https://uzzju.com/post/16.java

分享给朋友:
返回列表

没有更早的文章了...

下一篇:用Digispark制作BadUSB+msf植入病毒木马

相关文章

用Digispark制作BadUSB+msf植入病毒木马

用Digispark制作BadUSB+msf植入病毒木马

用Digispark制作BadUSB+msf植入病毒木马 0x001-简介 概述 在2014年美国黑帽大会上,安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了他们称为“BadUSB”的攻击方法,这种...

博客同步腾讯云

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3oa4dnff6cqog...

打算在博客开个专栏写写逻辑漏洞的思考:)

做漏洞审核也有快1年,大大小小的逻辑漏洞,也见的差不多, 接触到很多,想总结总结,并思考其中存在的问题和修复方式。...

等了1个月的CVE编号终于下来了,看来CNVD审核更快

等了1个月的CVE编号终于下来了,看来CNVD审核更快

我都快忘了什么时候申请的了。。。今晚看着电脑突然收到邮件,回复了我2个CVE编号给了两个编号,还不错,我都忘了我交了俩,一个前台洞,一个后台。。。。还是cnvd审核快...

ipad远程MacBookPro远程办公的终极解决方案

ipad远程MacBookPro远程办公的终极解决方案

吐槽作为安全技术人员来说,用ipad远程控制MacBook Pro,在我看来是一件很酷的事情!:) 首先吐槽一下自己为什么会有这个奇怪的想法,原因是因为,目前我有一个16寸的mac,我每天下班的第一个动作就是先把扩展坞拔掉,随后从扩展坞上...

 Windows11 LogonUI.exe 系统在应用程序中检测到基于堆栈都缓冲区溢出,溢出允许恶意用户获得此应用程序都控制。

Windows11 LogonUI.exe 系统在应用程序中检测到基于堆栈都缓冲区溢出,溢出允许恶意用户获得此应用程序都控制。

问题LogonUI.exe系统错误 系统在应用程序中检测到基于堆栈都缓冲区溢出,溢出允许恶意用户获得此应用程序都控制。 事情线:2023年6月3日一整天直至次日凌晨2点,我都不在家,次日凌晨2点(6月4日)回到家中发现一直运行中都电脑出...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。