ElasticSearch学习笔记

2022-04-25 16:16:25 浏览数 (1)

ElasticSearch学习笔记

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

关系型 Relational DB -> DataBases -> Tables -> Rows -> Columns Elasticsearch Elasticsearch -> Indices -> Types -> Documents -> Fields

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

二、Elasticsearch增删改查

1、增

指定ID的情况下

代码语言:javascript复制
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

代码语言:javascript复制
POST users/_doc
{
    "username": "huxy",
    "age": "18"
}

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

2、查

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

代码语言:javascript复制
GET users/_doc/1

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

3、改

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

代码语言:javascript复制
POST users/_update/1
{
    "doc": {
        "job": "coder",
        "message": "hello world"
    }
}

4、删

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

代码语言:javascript复制
Delete 索引名/_doc/文档id

三、Elasticsearch查询常见方法

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

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

代码语言:javascript复制
GET _cat/indices

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

代码语言:javascript复制
GET 索引名/_mapping

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

代码语言:javascript复制
GET sec*/_search

4、查询所有索引模板

代码语言:javascript复制
GET _template

5、查询具体索引模板

代码语言:javascript复制
GET _template/模板名

6、查询集群健康状态

代码语言:javascript复制
GET _cluster/health

7、查询所有节点

代码语言:javascript复制
GET _cat/nodes

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

代码语言:javascript复制
GET _cat/shards

9、查询所有插件

代码语言:javascript复制
GET _cat/plugins

四、Elasticsearch高级查询常见方法

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

代码语言:javascript复制
GET /index/type/_search
{
    "query": {
        "match_all": {}
    }
}

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

代码语言:javascript复制
GET /index/type/_search
{
    "query": {
        "term" : {"字段名": "值"}
    }
}

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

代码语言:javascript复制
GET /index/tpe/_search
{
    "query": {
        "match": {"字段名": "值"}
    }
}

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

代码语言:javascript复制
GET /index/type/_search
{
    "query":{
        "range": {
            "age": {"gte": 15, "lte": 25}
        }
    }
}

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

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

代码语言:javascript复制
GET /index/type/_search
{
    "query":{
        "bool":{
            "filter": {
                "term": {"字段": "值"}
            }
        }
    }
}

五、DSL查询方法

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

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

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

1、基本语法

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

代码语言:javascript复制
GET /_search
{
    "query": <quer clause>
}

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

代码语言:javascript复制
GET /_search
{
    "query": {}
}

以上语句等价于

代码语言:javascript复制
GET /_search

基本查询案例

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

代码语言:javascript复制
GET /_search
{
    "query": {
        "match": {
            "full_name": "john"
        }
    }
}

查询与过滤

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

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

查询Query

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

过滤Filter

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

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

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

代码语言:javascript复制
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的文档

代码语言:javascript复制
GET /_search
{
    "query" : {
        "match" : {
            "full_name" : "John Smith"
        }
    }
}

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

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

代码语言:javascript复制
GET /_search
{
    "query": {
        "match" : {
            "full_name" : {
                "query" : "John Smith",
                "operator" : "and"
            }
        }
    }
}

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

0 人点赞