推广 热搜: page  数据  小红  红书  考试  论文  数据分析  关键词  哪些  搜索 

ElasticSearch学习(四):增删改查、高亮、聚合、别名、重建索引

   日期:2024-12-31     移动:https://sicmodule.kub2b.com/mobile/quote/17199.html

目录

1、Restfull

2、查看ES的基本信息

2.1、查看集群信息

3、索引操作

3.1、创建并显示指定索引字段的类型

3.2、通过创建文档的方式自动映射字段的类型

4、文档操作

4.1、增加文档信息

4.2、更新文档信息

4.3、获取文档信息

4.4、删除文档信息

5、批量操作 

5.1、批量查询

5.2、批量插入数据

5.3、批量删除

5.4、批量更新

6、查询数据

6.1、查询所有文档信息

6.2、根据关键字查询文档信息

6.3、全文匹配查询(match

 6.3.1、单字段匹配查询

 6.3.2、多字段匹配查询

6.4、顺序匹配(Match_phrase

6.5、多字段查询(multi_match)

6.6、精确匹配(term)

6.7、多词条精确匹配(terms) 

6.8、指定匹配数组内容(Terms_set

6.9、多条件复合查询

6.10、查询子句

6.11、SQL 查询

6.12、Range 范围查询与 Sort 排序

6.13、通配符查询(Wildcard

6.14、指定Id值查询(Ids

6.15、以特定前缀开头(Prefix

6.16、多查询一次提交(Msearch

6.17、查询字段是否存在(Exists

6.18、控制输出的的字段

6.18.1、通过 filter_path 来控制输出的的字段 

 6.18.2、通过 _source来控制输出字段

6.18.3、通过 _source 中的 includes 属性来控制输出字段

 6.18.4、通过 _source 中的 exclude属性排除指定字段输出(exclude后续版本已弃用

6.18.5、设置 _source 为 false,这样不返回任何的 _source 信息

 6.19、分页查询

6.20、高亮查询

7、Profile 调试工具

8、聚合查询

8.1、指标聚合分析(Metric )

8.1.1、avg示例:查询所有用户的平均年龄

8.1.2、avg示例:查询地址在 “广东省”用户的平均工资

8.1.3、max示例:查询年龄的最大值

8.1.4、min示例:查询年龄的最小值

8.1.5、sum示例:查询符合条件的年龄之和

8.1.6、cardinality示例:查询所有用户不同年龄的数量

8.1.7、stats示例:查出所有用户的年龄stats信息

8.1.8、extended_stats示例:查出所有用户的年龄extended_stats信息

8.1.9、percentile示例:查出所有用户的年龄占比

8.2、Bucket 分桶聚合分析

8.2.1、分桶group by示例:根据年龄聚合查询

8.2.2、分桶group by示例:根据年龄段聚合查询

8.2.3、分桶group by示例:根据用户出生日期的年月分组分段聚合查询

8.2.4、group by 进阶示例:按照年龄聚合,并查询出每个年龄这些人的平均薪资

8.2.5、group by 进阶示例:查出所有年龄分布,并且这些年龄段中 性别为男 的平均薪资和 性别为女 的平均薪资以及这个年龄的用户信息

9、queryString查询

10、重建索引

10.1、创建test_index_v1索引、添加数据

10.2、业务变更,字段类型需要变动

10.3、 新建索引库 :test_index_v2

10.4、将test_index_v1 数据拷贝到 test_index_v2

11、别名的使用

11.1、查询别名

11.2、新增别名

11.3、删除别名

11.4、重命名别名

11.5、为多个索引指定一个别名

11.6、为同个索引指定多个别名 

11.7、通过别名读索引

 11.8、通过别名写索引



        Elasticsearch默认走的是http协议,而http协议它是一种无状态的协议,无状态就是指服务端它不会记录客户端的所有信息和操作,客户端必须每次带上自己的状态去请求服务器。因此,如果客户端想要操作这个服务器,必须通过某些手段,才能让服务器发生状态转化。而这种转化是建立在表现层之上的,所以说这就表现层的状态转化。

转化手段

  1. GET:用来获取资源
  2. POST:用来创建资源(也可以用来更新资源)
  3. PUT:用来更新资源
  4. DELETE:用来删除资源

我们对ES的所有操作,都被封装成了RestAPI,所以我们只要发送请求就行了。

查看所有结点GET _cat/nodes

查看ES健康状况GET _cat/health

  • Green:主分片与副本都正常分配
  • Yellow:主分片全部正常分配,有副本分片未能正常分配
  • Red:有主分片未能分配

查看主节点GET _cat/master

查看所有索引:[类似于show databases] GET _cat/indices 

以上查询带上参数 ?v可以显示标题信息,如

 
 

        创建文件时,当索引不存在的时候会自动创建并且字段类型自动根据值进行映射。

格式:PUT /索引名/类型名/文档id

6.x的写法是{index}/{type}/{id},例如:user/_doc/1 

7.x的写法是{index}/_doc/{id},例如:user/_doc/1

在6.x中一个index中type只能有一个,可以自定义

在7.x中将type概念移除了,所以现在建议直接写成_doc,当然你硬要指定type类型也行,只是ES是给出一个警告。

创建文档,并自动生成index。示例如下

 

查看索引:GET user

查看索引字段类型:GET user/_mapping

删除索引:DELETE user

es使用版本:6.8.2

未指定文档id时,创建文档,只能用POST(创建或更新)。

 
 

 说明:上面的红色报警信息,是指6.x版本中默认分片为5,从7.x开始,默认分片为1,如果要更改,需要自己创建索引,或使用索引模板。

增加文档时指定ID:该操作为更新操作,可以使用PUT(更新POST(创建或更新

 
 

        更新文档信息可以使用PUT和POST来请求。

        PUT修改:全量字段更新。-- 覆盖式修改

        POST修改:指定字段更新(推荐使用)。

指定字段更新的命令

        

 

使用PUT方式更新之前创建的 id=1 的文档信息。

 

 可以发现这里只更新了name字段,没有更新其它的字段,所以其它字段默认会填充空值。

使用POST请求修改文档

首先将没个字段的值都初始化

 

然后再用POST请求执行修改文档操作

POST方式第一种更新

 

第一次执行结果

         使用这种更新操作进行重复更新时,若数据与原先一致,则不进行任何操作。返回的结果是,而不是

POST方式第二种更新: 

 

第一次执行结果

 执行后的数据

第二次执行结果

         使用第二种更新操作时[即不带_update],无论是否重复更新,数据是否一致,都会进行更新,version版本相应增加。因此若使用PUT方式,结果也一致。

        获取 user的索引 id=1 的文档信息。

 

        查询文档数量

 
 

        删除之前创建的 id=1 的文档信息。

 

         根据查询语句删除:        

 

        删除所有数据

 
 

        有些情况下可以通过批量操作以减少网络请求。如:批量查询、批量插入数据等。

在Elasticsearch中,支持批量的插入、修改、删除操作,都是通过_bulk的api完成的。

_bulk分类

行为解释create当文档不存在时创建之index创建新文档或替换已有文档update局部更新文档delete删除一个文档

在索引、 创建、 更新或删除时必须指定文档的 _index 、 _type 、 _id 这些元数据(metadata)。

 
 
 

  请求格式如下

 

        需要注意的是,每一条数据都由两行构成(delete除外,其他的命令比如index和create都是由元信息行和数据行组成;update比较特殊它的数据行可能是doc也可能是upsert或者script。

        注意,每一行都是通过回车符来判断结束,因此如果你自己定义了json,千万不要使用回车符。不然_bulk命令会报错的

 
 

_delete_by_query 通过查询删除,既先query出符合条件的内容再进行delete操作.

 
 

可以通过来获得_source、、、、、、、等字段信息。

 update_by_query 顾名思义,通过查询更新,既先query出符合条件的内容再进行update操作,新增字段,修改字段值都可以满足

 
 

在查询命令后拼上 ?pretty ,可以将返回结果进行格式化。

 
 

        注意:text类型可以根据字段分词搜索,keyword关键词不会处理分词器

 
 

        会对搜索词进行分词拆解,然后查询,求并集。

         match是经过analyer的,也就是说,文档首先被分析器给处理了。根据不同的分析器,分析的结果也稍显不同,然后再根据分词结果进行匹配。   

match 查询语法汇总

  1. match_all:查询全部。
  2. match:返回所有匹配的分词。
  3. match_phrase:短语查询,在match的基础上进一步查询词组,可以指定slop分词间隔。
  4. match_phrase_prefix:前缀查询,根据短语中最后一个词组做前缀匹配,可以应用于搜索提示,但注意和max_expanions搭配。其实默认是50.......
  5. multi_match:多字段查询,使用相当的灵活,可以完成match_phrase和match_phrase_prefix的工作。

Match中的模糊匹配与强制匹配 : ‘operator’

  • or :匹配单个或多个字符 ,不区分大小写,不区分顺序。默认operator为OR。
  • and :必须全匹配。

设置参数 minimum_should_match 来设置至少匹配的数量。

 6.3.1、单字段匹配查询

 

 6.3.2、多字段匹配查询

 
 

       会对搜索词进行分词拆解

        match_phrase与match 类似,但是match 查询时不用分先后顺序的,match_phrase 严格按顺序匹配。先将查询条件进行分词,然后查询.

 
 

        会对搜索词进行分词拆解。

         multi_match:不知道哪个字段含有 指定关键词,在这种情况下,我们可以使用 multi_match 来进行搜索。

 
 

关于查询过滤条件中term和match的区别
term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解
match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配。

 
 

        不会再对搜索词进行分词拆解

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

        terms里的[ ] 多个是or的关系,只要满足其中一个词就可以。

        在这里我们使用了name.keyword。对于一些刚接触 Elasticsearch的人来说,这个可能比较陌生。正确的理解是 name在我们的 mapping 中是一个 multi-field 项。它既是 text 也是 keyword 类型。对于一个 keyword 类型的项来说,这个项里面的所有字符都被当做一个字符串。它们在建立文档时,不需要进行 index。keyword 字段用于精确搜索,聚合 和 排序(sorting)。keyword会使返回结果的_score 项为0。

 
 

测试数据如下

 

        refresh : 数据插入立即生效可以使更改可见以进行搜索的操作。通常会有一个 refresh timer 来定时完成这个操作。这个周期为1秒。这也是我们通常所说的 Elasticsearch 可以实现秒级的搜索。当然这个 timer 的周期也可以在索引的设置中进行配置。如果我们想让我们的结果马上可以对搜索可见,我们可以用refresh=true。

测试案例

        找出在 programming_languages 中同时含有 c++, java 以及 php 中至少有两项的文档。在这里,我们使用了一个在文档中定义的字段 required_matches 来定义最少满足要求的 term 个数,这里只数组中任意搭配,只要满足数量即可:

 

terms 指定要满足的数组。
minimum_should_match_field : 指定文档中条件的属性名。
required_matches 在文档的值为2,所以指定该值最后结果就是最少满足‘terms’属性中的至少2个。

如果没有一个专有的字段来定义满足条件的个数的话,可以再查询条件中自定义,示例如下

 
 

        复合查询指把很多个 leaf 查询组合起来从而形成更为复杂的查询。

        bool 查询由 下面的 must, must_not, should 及 filter 共同来组成的。你可以使用 minimum_should_match 参数指定返回的文档必须匹配的子句的数量或百分比。

示例

 

说明

"query": {        
       "bool" : {

          "must" :     [],        //与 AND 等价。  单个条件使用{},多个条件使【】 .
          "must_not" :   [],   //与 NOT 等价 。 同上  
          "should" : [],         //与 OR  等价。   同上
          "filter":  []            //与must相同结果,但不会参与评分。同上
    }
 }

must : 必须满足的条件,按相关性降序排序显示。
must_not : 可以把一些满足条件的排出在外(not in )。
should : 它表述“或”的意思,也就是有就更好,没有就算了。如果条件满足,其相关性会更高,那么搜索得到的结果会排在前面。
filter : 与must相同表示满足条件,但不会参与评分。

查询类型对 hits(即:查询结果) 及 _score(即:评分、相关度) 的影响

查询类型影响 hits影响 _scoremustYesYesmust_notYesNoshouldNoYesfilterYesNo

        should 只有在特殊的情况下才会影响 hits。在正常的情况下它不会影响搜索文档的个数。那么在哪些情况下会影响搜索的结果呢?这种情况就是针对只有 should 的搜索情况,也就是如果你在 bool query 里,不含有 must, must_not 及 filter 的情况下,一个或更多的 should 必须有一个匹配才会有结果。

filter与must的区别 :

  • 同样是按条件匹配
  • filter不统计相关度,must统计相关度
  • must比filter计算更复杂,更耗时。

        返回与一个或多个包在一起的查询(称为查询子句或子句)匹配的文档。

        如果返回的文档与多个查询子句匹配,则 dis_max 查询为该文档分配来自任何匹配子句的最高相关性得分,并为任何其他匹配子查询分配平局打破增量。

示例

 

dis_max参数

  • queries :包含一个或者多个查询子句。返回的文档必须匹配其中的一个或者多个,如果文档匹配了多个,则返回最高得分。
  • tie_breaker :一个介于0~1.0之间的Float数,用于当文档匹配了多个查询子句时提升相关度分数。默认为0.0

        在上面的 dis_max 查询中,它将返回任何一个在 queries 中锁定的查询文档。每个匹配分数是按照如下的规则来进行计算的

  1. 如果一个文档匹配其中的一个或多个查询,那么最终的得分将以其中最高的那个得分来进行计算。
  2. 在默认的情况下,tie_breaker 的值为0。它可以是 0 到 1.0 之间的数。

如果文档匹配多个子句,则 dis_max 查询将计算该文档的相关性得分,如下所示

  1. 从具有最高分数的匹配子句中获取相关性分数。
  2. 将来自其他任何匹配子句的得分乘以 tie_breaker 值。
  3. 将最高分数加到相乘的分数上。

如果 tie_breaker 值大于0.0,则所有匹配子句均计数,但得分最高的子句计数最高。

Elasticsearch 也对 SQL 有支持,示例如下

 

返回结果

可以通过如下的方法得到它对应的 DSL 语句(即es的查询语句: 

 

返回结果如下

 
 

range : 查询范围
sort : 可以针对多个字段同时进行排序。下面首先以 age 进行降序排序。如果是 age 是一样的话,那么就按照salary来进行排序。

 
 

不会对搜索词进行分词拆解。

可以使用 wildcard 查询一个字符串里含有的字符

  • ? 匹配任何字符
  • * 匹配零个或多个字符
 
 
 
 

不会对搜索词进行分词拆解。

 
 

示例

 

        会将多个查询一并提交,一并返回结果,一个查询报错不会影响另一个结果 。以上查询返回结果如下

 
 

        查询文档中包含address字段的所有文档信息。示例如下

        文档里只要address这个字段不为空,那么就会被返回。反之,如果一个文档里address这个字段是空的,那么就不会返回。

 

        查询文档不含address 这个字段的所有的文档,可以这样查询

        注:插入时指定字段值为null,那么exists也会过滤掉。

 
 

正常的查询结果(不控制出参字段)如下

 

6.18.1、通过 filter_path 来控制输出的的字段 

 

返回结果如下

 

 6.18.2、通过 _source来控制输出字段

        _source 设置为[] {} 那么就是显示所有的字段

 

查询结果如下

 

6.18.3、通过 _source 中的 includes 属性来控制输出字段

 

查询结果如下

 

 6.18.4、通过 _source 中的 exclude属性输出(exclude后续版本已弃用

 

查询结果

 

6.18.5、设置 _source 为 false,这样不返回任何的 _source 信息

 

查询结果

 
 

        这里的分页查询和mysql中的分页查询操作本质上是没有区别的,是只要规定我们的起始点以及页的大小即可。

 

查询结果

        总数据量是4条,但是这里我们查询出来只显示了前面的两条数据,显然分页查询已经执行成功。

 
 

        我们平时在使用百度的时候,输入关键字查询内容后,关键字一般都是高亮显示的。所以ES作为一个专业的搜索框架肯定也提供了这样的功能。

        ES的默认高亮显示:。

 

   查询结果

 

        ES自定义高亮显示(在highlight中,pre_tags用来实现我们的自定义标签的前半部分,在这里,我们也可以为自定义的 标签添加属性和样式。post_tags实现标签的后半部分,组成一个完整的标签。至于标签中的内容,则还是交给fields来完成

 

查询结果如下

 
 

        会显示查询出结果的详细计算过程。

 
 

        我们平时在使用Elasticsearch时,更多会用到聚合操作,它类似SQL中的group by操作。ES的聚合查询一定是先查出结果,然后对结果使用聚合函数做处理,常用的操作有:avg:求平均、max:最大值、min:最小值、sum:求和等。

在ES中聚合分为指标聚合和分桶聚合

  • 指标聚合:对一个数据集求最大、最小、和、平均值等。
  • 分桶聚合:除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行游标聚合。

指标聚合:对一个数据集求最大、最小、和、平均值等.

  • 单值分析,只输出一个分析结果——avg:求平均、max:最大值、min:最小值、sum:求和、cardinality:值去重计数。
  • 多值分析,输出多个分析结果
    • stats:统计了count 、max、 min、 avg、 sum  5个值。
    • extended_stats:比stats多很多更加高级的统计结果:如平方和、方差、标准差、平均值加/减两个标准差的区间等。
    • percentile占比百分位对应的值统计,默认返回【1,5,25,50,75,95,99】分位上的值

8.1.1、avg示例:查询所有用户的平均年龄

 

         上例中,首先匹配查询所有的数据。在此基础上做查询平均值的操作,这里就用到了聚合函数,其语法被封装在aggs,而avg_age则是为查询结果起个别名,封装了计算出的平均值

上面示例查询结果如下

 

如果只想看输出的值,而不关心输出的文档的话可以通过size=0来控制。

 

查询结果如下

 

8.1.2、avg示例:查询地址在 “广东省”用户的平均工资

 

查询结果

 

8.1.3、max示例:查询年龄的最大值

 

查询结果

 

8.1.4、min示例:查询年龄的最小值

 

查询结果

 

8.1.5、sum示例:查询符合条件的年龄之和

 

查询结果

 

8.1.6、cardinality示例:查询所有用户不同年龄的数量

        cardinality 即去重计算,类似sql中 count(distinct,先去重再求和,计算指定field值的种类数。大数据量下,统计会存在误差。

        相同年龄的数据,count认为是1。

        在执行该示例前,专门添加了一条年龄为29的数据(原数据中已存在年龄29的数据)。

 

查询结果

 

8.1.7、stats示例:查出所有用户的年龄stats信息

 

查询结果

 

8.1.8、extended_stats示例:查出所有用户的年龄extended_stats信息

 

查询结果

 

8.1.9、percentile示例:查出所有用户的年龄占比

 

查询结果

 
 

        分桶聚合:除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行游标聚合。

  terms : 聚合分组,类似于sql中group by。

8.2.1、分桶group by示例:根据年龄聚合查询

 

查询结果

 

8.2.2、分桶group by示例:根据年龄段聚合查询

 

查询结果

 

8.2.3、分桶group by示例:根据用户出生日期的年月分组分段聚合查询

 

查询结果

 

8.2.4、group by 进阶示例:按照年龄聚合,并查询出每个年龄这些人的平均薪资

        其实就是aggs里面又加了一个aggs,第二个aggs根据第一个aggs聚合后的结果在聚合。

 

查询结果

 

8.2.5、group by 进阶示例:查出所有年龄分布,并且这些年龄段中 性别为男 的平均薪资和 性别为女 的平均薪资以及这个年龄的用户信息

 

查询结果

 
 

        会对查询条件进行分词, 然后将分词后的查询条件和词条进行等值匹配,默认取并集(OR,可以指定单个字段也可多个查询字段。

示例

 

查询结果

 
 

        随着业务需求的变更,索引的结构可能发生改变。ElasticSearch的索引一旦创建只允许添加字段,不允许改变字段。因为改变字段,需要重建倒排索引,影响内部缓存结构,性能太低。那么此时,就需要重建一个新的索引,并将原有索引的数据导入到新索引中。

  1. 原索引库 :test_index_v1
  2. 新索引库 :test_index_v2

        创建test_index_v1索引,索引名称必须全部小写。

 
 
 
 
 
 
 
 
 
 

查询结果

 
 
 

别名查询结果

 
 
 
 
 
 
 

查询所有别名

 
 
 
 
 
本文地址:https://sicmodule.kub2b.com/quote/17199.html     企库往 https://sicmodule.kub2b.com/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


0相关评论
相关最新动态
推荐最新动态
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号