我是靠谱客的博主 雪白水池,最近开发中收集的这篇文章主要介绍ES的学习心得,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 一、连接数据库和插件得使用

1.ES的使用是依据Chrome上的插件来进行执行的——clasticsearch5x-head-chrome

2.ES要用IP地址和端口号进行连接使用   xxx.xxx.xxx.xxx:xxxx

3.进行postman调用ES库,http://xxx.xxx.xxx.xxx:xxxxx/索引名/固定格式(-search)

        然后使用DSL语句进行查询(JSON格式)

4.ES插件的使用      (1)概览——查询索引信息与一些基本操作

                                (2)索引——查看全部索引的一些基本信息

                                (3)数据浏览——查看某个索引下的Type、Documents、Fields等信息

                                (4)基本查询

                                        a.must——必要查询,有多个并列查询,一个文档满足查询 条件才行

                                           mastnot——与must相反

                                           should——只要符合要求就可以返回

                                        b.选择索引内的Type名

                                        c.term——查询某个字段里含有某个关键词的文档

                                           wildcard——通配符查询,类似模糊查询

                                           prefix——前缀查询,通过一个关键字指定Fields前缀查询对应的文档

                                           fuzzy——模糊查询

                                           range——按照指定范围查找一批数据

                                           query-string——字段查询

                                           text——分词查询

                                           missing——查询不存在的字段

4.ES中对mapping 的理解

mapping参数
 字段中的type(es数据类型)                                                                                                   
(1)text  字符串,分词,全文索引

(2)keyword  关键字,不分词,适合id,email等这种不分词的字段

(3)numeric 数字类型有integer、long、short、byte、double、float等类型  

(4)date  时间类型

(5)boolean   布尔类型

(6)binary    接收base64编码的字符串

(7)rang    具体有integer_range,float_range,long_range,double_range,date_range,ip_range,可存储范围数据,

什么是mapping

ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。同样的, 一个number类型的mapping字段只能存储number类型的数据。

同语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。

当你的查询没有返回相应的数据, 你的mapping很有可能有问题。当你拿不准的时候, 直接检查你的mapping。

剖析mapping

一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。

filter的功能很容易理解:一个filter就是一个转换数据的方法, 输入一个字符串,这个方法返回另一个字符串,比如一个将字符串转为小写的方法就是一个filter很好的例子。

一个analyzer由一组顺序排列的filter组成,执行分析的过程就是按顺序一个filter一个filter依次调用, ES存储和索引最后得到的结果。

总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。

对于 String 字段,可以设置类型为 text 或者 keyword。text类型的数据会被分词处理,而 keyword 类型的数据不会被分词处理。因此想根据某个字段精确查询的话,可以将其设置为 keyword 类型(版本5.0之后)。

如果一个索引库已经存在索引文档,这时想要更改索引的mapping的话,最好删除当前索引库,重新建立索引库,设置 mapping 之后,将数据重新添加到索引库中。
 

默认analyzer

回到我们的例子, ES猜测description字段是string类型,于是默认创建一个string类型的mapping,它使用默认的全局analyzer, 默认的analyzer是标准analyzer, 这个标准analyzer有三个filter:token filter, lowercase filter和stop token filter。

我们可以在做查询的时候键入_analyze关键字查看分析的过程

(1)往es里面直接插入数据,es会自动建立索引,同时建立type以及对应的mapping

(2)mapping中就自动定义了每个field的数据类型

(3)不同的数据类型(比如说text和date),可能有的是exact value,有的是full text

(4)exact value,在建立倒排索引的时候,分词的时候,是将整个值一起作为一个关键词建立到倒排索引中去;full text,会经历各种各样的处理,分词,normaliztion(时态转换,同义词转换,大小写转换),才会建立到倒排索引中去。

(5)exact value和full text类型的field决定了,在一个搜索过来的时候,对exact value field或者是full text field进行搜索的行为不一样,会跟建立倒排索引的行为保持一致;比如说exact value搜索的时候,就是直接按照整个值进行匹配,full text query string,也会进行分词和normalization再去倒排索引中去搜索。

(6)可以用es的dynamic mapping,让其自动建立mapping,包括自动设置数据类型;也可以提前手动创建index和type的mapping,自己对各个field进行设置,包括数据类型,索引行为,分词器等等

  mapping就是index的type的元数据,每个type都有一个自己的mapping,决定了数据类型,建立倒排索引的行为,还有进行搜索的行为

  1、mapping核心的数据类型

  string,byte,short,integer,long,float,double,boolean,date

  2、dynamic mapping

  true or false --> boolean

  123      --> long

  123.45    --> double

  2017-01-01  --> date

  "hello world" --> string/text

  3、查看mapping

  GET /index/_mapping/type

ES的工作状态:status 指示集群总体是否正常种颜色含义

green

所有的主分片和副本分片都正常运行

yellow

所有的主分片都正常运行,但不是所有的副本分片都正常运行

red

有主分片没能正常运行

二、查询方式的使用.(RESTFUL    API)

基本搜索 _search:

        最基本的搜索API表单是空搜索(empty search),它没有指定任何的查询条件,只返回集群索引中的所有文档:

快速检查集群的健康状况:GET /_cat/health?v(?v是在Linux中使用的格式化符号)

快速查看集群中有哪些索引:GET /_cat/indices?v

创建索引:PUT /test_index?pretty

删除索引:DELETE /test_index?pretty

新增文档,建立索引PUT /index/type/id

检索文档GET /index/type/id

替换文档PUT /ecommerce/product/1

更新文档POST /ecommerce/product/1/_update

删除文档DELETE /ecommerce/product/1

 query string search:GET /ecommerce/product/_search

三、基础DSL语句查询

match 无论 你在任何字段上进行的是全文搜索还是精确查询
range 范围
term 查询被用于精确值 匹配
Ø 数字、时间、 布尔
Ø not_analyzed 字符串
prefix
wildcard regexp (模糊和正则):标准的 shell 通配符 查询
Ø ? 匹配任意 字符
Ø * 匹配 0 或多个字符
must / must_not
Ø 文档 必须 / 必须不 匹配 这些条件才能被包含 进来
Should
Ø 满足任意 语句,将增加 _score ,否则,无任何 影响
filter 过滤模式 必须匹配
Ø 评分没有贡献,只是根据过滤标准来排除或 包含文档
bool 查询将多查询组合在一起,成为用户自己想要的布尔 查询

1、简单查询:

 1)查询所有结果:

GET /wtyy-test/user/_search
{
    "query":{"match_all":{}}
}
 2)条件查询:post_filter  和 query 的 区别 ,语法上没区别,唯一的在于 filter 不评分,所以 filter  比 query  快很多 ,filter 和query  可以共存。

GET /wtyy-test/user/_search
{
    "query":{
          "match":{
                    "name":"李四"
          }
    },
    "sort":[
        {
             "age":"desc"
       }
   ]
}
 3)范围查询:

GET /wtyy-test/user/_search
{
    "query":{
      "range": {
        "age": {
          "gte": 18,
          "lte": 20
        }
      }
    }
  
}
  4)指定查询结果的字段 _source

GET /wtyy-test/user/_search
{
    "query":{"match_all":{}},
    "_source":["name","age"]
}
5)多条件的复合查询bool : bool 里面的都是一些条件 ,must 必须瞒足,should 只要满足 minimum_should_match 个条件是ture ,filter只是过滤不计入评分。

GET /wtyy-test/user/_search
{
    "query": {
        "bool": {
            "must": [{
                "match": {
                    "name": "李四"
                }
            }],
            "should": [{
                    "match": {
                        "age": 18
                    }
 
                },
                {
                    "match": {
                        "address": "重庆"
                    }
 
                }
            ],
            "minimum_should_match": 1
 
        }
    }
}
 2、分页查询:对于查询得到的结果,数目过多的情况下,es 默认会进行分页。分页主要有两个参数进行控制: size 显示应该返回的结果数量,默认是 10 ;from 显示应该跳过的初始结果数量,默认是 0。

GET /wtyy-test/user/_search
{
  "query":{
    "match": {
        "name": "李四"
    }
  },
  "size": 10,
  "from": 1
}
3、聚合函数:

1)求平均值:

GET  wtyy-test/user/_search
{
  "query": {
    "match": {"name":"李四"}
  },
  "aggs": {
    "total_count": {
      "value_count": {
        "field": "age"
      }
    },
    "pjz":{
      "avg": {
        "field": "age"
      }
    }
    
  }
  
}
  4、分组:

GET  wtyy-test/user/_search
{
  "query": {
    "match": {"name":"李四"}
  },
  "aggs": {
    "fz": {
      "terms": {
        "field": "age"
      }
    }
  }
}
5、 scoll 游标查询,指定 scroll=时间 ,指定保存的分钟数,第一次发起请求放回的不是数据,而是 _scroll_id ,后面通过 _scroll_id 去请求数据,非常适合大批量查询。

get /user/student/_search?scroll=1m
{
    "query":{
      "match_all": {}
    },
    "size":2
  
}
GET /_search/scroll
{
    "scroll": "1m",
    "scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAIuFkRMbVZ0WFdvU1ZHWEJuelFIQk4tdFEAAAAAAAACLBZETG1WdFhXb1NWR1hCbnpRSEJOLXRRAAAAAAAAAi0WRExtVnRYV29TVkdYQm56UUhCTi10UQAAAAAAAAO1FlQwSkJqVng5UVpPUTIwbWw0a0NKV3cAAAAAAAADthZUMEpCalZ4OVFaT1EyMG1sNGtDSld3"
}
 游标 查询 是在 es 里面缓存了结果 ,然后一次 一次的去取 所以发起 第一次请求的时候只有 size ,没有from ,后面的 请求只有 scroll_id 和  scroll 时间

6、关键词高亮显示:

通常自己开发搜索引擎的时候,往往需要对搜索结果中的关键词高亮这种功能。请求体增加一个 highlight 属性,里面指明要高亮的字段。如下:

GET  wtyy-test/user/_search
{
  "query": {
    "match": {
      "address": "北京"
    }
  },
  "highlight": {
    "fields": {
      "address": {}
    }
  }
}

在返回体中有一个 highlight 字段,里面对 message 字段进行高亮处理: 关键词使用了 <em></em> 标签包围了。可以使用 css 修改对 <em> 标签的样式,以实现关键词高亮效果。

7、多索引查询:在多个索引中同时搜索文档,把多个索引看做一个使用。其实这也意味着,我们在存储的时候,没必要把所有的文档都存在一个 Index 中。 很常见的一个操作是,我们可以将文档按天分索引存储。例如: es-test-2020-03-11,es-test-2020-03-12 等, 在查询的时候,指定 es-test-* 查询即可,这样对外看来,文档似乎还是存储在一起,同时也减轻了 Index 的存储压力。(一个 ES 分片最多能存储 Integer.MAX_VALUE - 128 个文档)

GET /es-test-1,es-test-2/_search
GET /es-test-*/_search
GET /a*, b*/_search
8、批查询 api mget:

#批量查询
GET /_mget
{
  "docs":[
    {
      "_index":"user",
      "_type":"student",
      "_id":1
    },
    {
      "_index":"user",
      "_type":"student",
      "_id":2
    },
    {
      "_index":"user",
      "_type":"student",
      "_id":2
    }
  ]
}
 mget  如果请求url 里面有 index 和 type 后面 的 请求体里面就可以不写  index 和type

9、es的 并发处理 ,使用的乐观锁 在 后面加上 version:

POST  /user/student/1?version=3
{
  "name":"zyk",
  "age":0
}
 只有version = 当前记录的version的时候才能修改成功。es 可以自动控制 vserion 通过 ,version_type指定 ,version_type=external 要求 version 大于当前的version ,version_type=internal 这个是默认值 ,必须等于当前的值<br>version_type=external_gte 大于等于当前的version<br>version_type=force 已经废弃了不能用了,我也不知道以前什么意思,提升, Validation Failed: 1: version type [force] may no longer be used

POST  /user/student/1?version_type=external&version=505
{
  "name":"zyk",
  "age":0
}
 

ID查询
GET /es_product/_search
{
  "query": {
    "match": {
      "_id": "625f89ea206ee56da05e9939"
    }
  }
}

参数查询
GET /es_product/_search
{
  "size": 1000, 
  "query": {
    "match": {
      "goodsName": "立白"
    }
  }
}

查询总数
GET /es_product/_count
{
 
}

分词查询
GET _analyze
{
  "analyzer": "whitespace",
  "text": "青年 大学习"
}
 

 cluster_name: elasticsearch”,   #集群的名字
  
“status” : “yellow”,                         #集群的状态  
  
timed_out: false,                        #本次请求是否超时。所有每次请求都会显示是否超时
  number_of_nodes: 2,                 #节点数
  
number_of_data_nodes: 1,        #数据节点数
  
active_primary_shards: 216,      #主分片数,216index
  
active_shards: 216,                    #共有216个分片
  
relocating_shards: 0,                  #分片重新定位的个数
  initializing_shards: 0,                  #主分片出故障的个数,
  unassigned_shards: 216,           #未指定节点,配置了副本,仅用一台机器部署会出现这种情                                                             况,没有分配的复分片
  number_of_pending_tasks: 0,    #等待任务执行的个数
  number_of_in_flight_fetch: 0}     # 请求备份的个数

1.post请求/索引名/_search
{
  "query": { "match_all": {} }
}

其中,"query"表示定义查询,“match_all”表示在指定的索引中,查询所有文档。

2.增加页大小参数
post请求/索引名/_search
{
  "query": { "match_all": {} },
  "size": 1
}

"size"表示在每页查询多少条数据

3.增加起始参数和页大小参数
post请求/索引名/_search
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 10
}

"from"表示从哪一页开始查询


4.排序
post请求/索引名/_search
{
  "query": { "match_all": {} },
  "sort": { "balance": { "order": "desc" } }
}

“sort”参数是排序的意思,"balance"是要排序的字段, "order": "desc"表示序列倒序。默认返回前10条。

响应体里还提供了有关搜索请求的相关信息:

took – 查询花费时长(毫秒)
timed_out – 请求是否超时
_shards – 搜索了多少分片,成功、失败或者跳过了多个分片(明细)
max_score – 最相关的文档分数
hits.total.value - 找到的文档总数
hits.sort - 文档排序方式 (如没有则按相关性分数排序)
hits._score - 文档的相关性算分 (match_all 没有算分)

四、ES权重控制

1、索引期间boost
创建索引
说明:
在创建索引的过程中,在mappings中给字段设置boost的值为3,提升company的相关性权重。

get /testboost/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match_phrase": {
            "address": "湖北省"
          }
        },
        {
          "bool": {
            "should": [
              {
                "match_phrase": {
                  "deptName":{
                    "query": "技术部", 
                    "boost":1
                  } 
                }
              },
              {
                "match_phrase": {
                 "deptName":{
                    "query": "销售部", 
                    "boost":5
                  } 
                }
              }
            ]
          }
        }
      ]
    }
  }
}
 

最后

以上就是雪白水池为你收集整理的ES的学习心得的全部内容,希望文章能够帮你解决ES的学习心得所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部