• ElasticSearch学习


    ElasticSearch(中文官网)

    之前在蟹老板手下干命的日子里,我给公司搭建了一套LEK,收集我们测试环境、生成环境,每个服务运行状态,以及bug及时定位,现在在新东家ElasticSearch除了做日志收集,还会保存业务数据文档,提升查询效率。

    在上次写的“使用ElasticSearch、Kibana、Docker 进行日志收集” 介绍了如何进行环境搭建,以及日志数据收集。

    Elasticsearch 基本操作

    dev_tools命令执行面板

    dev_toolsKibana 提供的命令执行面板,当然大家也会看到其他人使用Postman调用ElasticSearch接口,但是我还是喜欢使用dev_tools(如果安装了Kibana就可以使用,也可以使用Postman)

    索引操作

    关于索引操作我列举了一些常用的api,大家可以根据我给出的文档连接详细的阅读文档,抛砖引你。

    创建索引

    索引必须小写,不支持大写,重复创建索引会报错

    1. # 创建索引
    2. PUT /test_dawn
    3. {
    4. }
    5. # 返回结果
    6. # 注意:创建索引库的分片数默认 1 片,在 7.0.0 之前的 Elasticsearch 版本中,默认 5 片
    7. {
    8. # 【响应结果】true 操作成功
    9. "acknowledged" : true,
    10. # 【分片结果】分片操作成功
    11. "shards_acknowledged" : true,
    12. # 【索引名称】
    13. "index" : "test_dawn"
    14. }

    查看所有索引详细信息

    GET /_cat/indices?v

    名称含义
    health当前服务器健康状态,green(集群完整),yellow(单点正常,集群不完整),red(单点异常)
    status索引打开、关闭
    index索引名
    uuid索引统一编号
    pri主分片数量
    rep副本数量
    docs.count可用文档数量
    docs.deleted文档删除状态(逻辑删除)
    store.size主分片和副分片整体占空间大小
    pri.store.size主分片占空间大小

    查看单个索引

    1. # 查看test_dawn索引信息
    2. GET /test_dawn
    3. # 返回参数
    4. {
    5. # 索引名
    6. "test_dawn" : {
    7. # 别名
    8. "aliases" : { },
    9. # 映射
    10. "mappings" : { },
    11. # 设置
    12. "settings" : {
    13. "index" : {
    14. # 创建时间
    15. "creation_date" : "1659450485862",
    16. # 主分片数量
    17. "number_of_shards" : "1",
    18. # 副分片数量
    19. "number_of_replicas" : "1",
    20. # 唯一标识
    21. "uuid" : "Gsu7-arFRJmju1p3_5wSOQ",
    22. "version" : {
    23. "created" : "7090299"
    24. },
    25. # 名称
    26. "provided_name" : "test_dawn"
    27. }
    28. }
    29. }
    30. }

    删除索引

    删除不存在的索引会报错

    DELETE /test_dawn

    创建映射

    提醒:索引不存在会报错
    创建映射就相当于,创建表需要添加字段、字段类型的操作(后面讲到文档操作的时候我们也可以直接添加属性,ElasticSearc会自动推断我们添加的属性使用什么类型)ElasticSearc属性类型

    1. # 创建映射
    2. PUT /test_dawn/_mapping
    3. {
    4. "properties":{
    5. "name": {
    6. # 支持分词,但是不支持分组
    7. "type": "text",
    8. # 字段会被索引,则可以用来进行搜索,反之
    9. "index": true,
    10. # 是否将数据进行独立存储,默认为 false
    11. "store": false,
    12. # 分词器只能在text 类型下使用
    13. # 指定该属性使用那个分词器
    14. "analyzer": "ik_max_word"
    15. },
    16. "age": {
    17. "type": "integer",
    18. "index": true,
    19. "store": false
    20. },
    21. "gender": {
    22. # 不能分词,数据会作为完整字段进行匹配,支持分组操作
    23. "type": "keyword",
    24. "index": true,
    25. "store": false
    26. }
    27. }
    28. }

    查看映射

    1. # 查看映射
    2. GET /test_dawn/_mapping

    store_source 对比

    默认情况下,字段值被索引以使它们可搜索,但它们不被存储。这意味着可以查询该字段,但无法检索原始字段值。
    通常这无关紧要。字段值已经 是默认存储的_source字段的一部分。如果您只想检索单个字段或几个字段的值,而不是整体_source,则可以通过 源过滤来实现。
    在某些情况下,它对一个领域是有意义store的。例如,如果您有一个包含 a title、 adate和一个非常大的content 字段的文档,您可能只想检索 thetitle和 thedate而不必从一个大字段中提取这些字段_source

    文档操作

    添加文档

    1. # 添加一个文档
    2. POST /test_dawn/_doc
    3. {
    4. "title":"少年说",
    5. "category":"青春",
    6. "images":"http://baidu.com"
    7. }
    8. # 返回参数
    9. {
    10. # 索引
    11. "_index" : "test_dawn",
    12. # 文档类型,默认是_doc 在老版中有应用场景,不过到8.0版本就开始淡化、抛弃
    13. "_type" : "_doc",
    14. # 文档唯一id 可以手动指定,或者自动生成
    15. "_id" : "evQSaYIBhcAYjjJxxtf3",
    16. # 当前文档本版,每次对该文档进行操作会+1
    17. "_version" : 1,
    18. # 当前操作类型,还有update
    19. "result" : "created",
    20. # 分片
    21. "_shards" : {
    22. # 分片总数量
    23. "total" : 2,
    24. # 分片成功数量
    25. "successful" : 1,
    26. # 分片失败数量
    27. "failed" : 0
    28. },
    29. "_seq_no" : 2,
    30. "_primary_term" : 1
    31. }

    手动指定Id

    查看文档

    1. # 查看文档
    2. GET /test_dawn/_doc/1234567890
    3. # 返回参数
    4. {
    5. "_index" : "test_dawn",
    6. "_type" : "_doc",
    7. "_id" : "1234567890",
    8. "_version" : 1,
    9. "_seq_no" : 0,
    10. "_primary_term" : 1,
    11. # 如果找到了为true
    12. "found" : true,
    13. "_source" : {
    14. "title" : "少年说",
    15. "category" : "青春",
    16. "images" : "http://baidu.com"
    17. }
    18. }

    修改文档

    刚才我们指定id创建文档,还有一个作用如果该id 存在就修改文档(全字段覆盖修改)

    1. # 指定id 或者 如果该id 存在就修改文档(全字段覆盖修改)
    2. POST /test_dawn/_doc/1234567890
    3. {
    4. "title":"少年说",
    5. "category":"青春"
    6. }

    使用该命令一定要注意注意,它是覆盖式的(工作事小,老婆跑了事大)

    指定字段更新

    删除文档

    1. # 删除文档
    2. DELETE /test_dawn/_doc/1234567890

    条件删除

    1. # 条件删除
    2. POST /test_dawn/_delete_by_query
    3. {
    4. "query": {
    5. "match": {
    6. "title": "少年说"
    7. }
    8. }
    9. }

    查询DSL

    Elasticsearch 提供了基于 JSON 的完整 Query DSL(Domain Specific Language)来定义查询。将查询 DSL 视为查询的 AST(抽象语法树)由两种类型的子句组成:

    • 叶查询子句
      叶查询子句在特定字段中查找特定值,例如 matchtermrange查询。这些查询可以单独使用。
    • 复合查询子句
      复合查询子句包装其他叶或复合查询,并用于以逻辑方式组合多个查询(例如 boolordis_max查询),或改变它们的行为(例如constant_score查询)。
      查询子句的行为不同,具体取决于它们是在 查询上下文还是过滤器上下文中使用。

    允许昂贵的查询
    某些类型的查询由于它们的实现方式,通常会执行缓慢,这会影响集群的稳定性。这些查询可以分类如下:

    match查询

    match查询是执行全文搜索的标准查询,包括模糊匹配选项。

    1. # 全文搜索的标准查询,包括模糊匹配
    2. GET /test_dawn/_search
    3. {
    4. "query": {
    5. "match": {
    6. "title": "少年"
    7. }
    8. }
    9. }

    term查询

    您可以使用term查询根据价格、产品 ID 或用户名等精确值查找文档。
    避免使用字段term查询。text
    默认情况下,Elasticsearch 会在分析text过程中更改字段的值。这会使查找字段值的精确匹配变得困难。text
    要搜索text字段值,请改用match查询。

    1. # 精确查询
    2. GET /test_dawn/_search
    3. {
    4. "query": {
    5. "term": {
    6. "_id": "vxvNeIIB7oKD63DUcC9h"
    7. }
    8. }
    9. }

    复合查询

    复合查询包装其他复合查询或叶查询,以组合它们的结果和分数,改变它们的行为,或者从查询切换到过滤上下文。

    用于组合多个叶或复合查询子句的默认查询,如 must或子句。and子句将 它们的分数组合在一起——匹配的子句越多越好——而and子句在过滤上下文中执行。 should must_not filter mustshould must_notfilter

    返回匹配positive查询的文档,但减少也匹配negative查询的文档的分数。

    包装另一个查询,但在过滤器上下文中执行它的查询。所有匹配的文档都被赋予相同的“常量” _score

    接受多个查询并返回与任何查询子句匹配的任何文档的查询。虽然bool查询结合了所有匹配查询的分数,但dis_max查询使用单个最佳匹配查询子句的分数。

    使用函数修改主查询返回的分数,以考虑流行度、新近度、距离或使用脚本实现的自定义算法等因素。

    bool查询

    匹配与其他查询的布尔组合匹配的文档的查询。bool 查询映射到 Lucene BooleanQuery。它是使用一个或多个布尔子句构建的,每个子句都有一个类型的出现。出现类型有:

    名称描述
    must子句(查询)必须出现在匹配的文档中,并将有助于得分。
    filter子句(查询)必须出现在匹配的文档中。然而,与 must查询的分数不同,将被忽略。过滤器子句在过滤器上下文中执行,这意味着忽略评分并考虑缓存子句。
    should子句(查询)应该出现在匹配的文档中。
    must_not子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着忽略评分并考虑缓存子句。因为忽略了评分,0所以返回所有文档的评分。

    该bool查询采用更多匹配更好的方法,因此每个匹配must或should子句的分数将加在一起以提供_score每个文档的最终结果。

    1. # 符合查询,其实我们只要记住:must(必须 )、must_not(必须不)、should(应该)的方式进行组合就可以了
    2. GET /test_dawn/_search
    3. {
    4. "query": {
    5. "bool": {
    6. "must": [
    7. {
    8. "match": {
    9. "_id": "vxvNeIIB7oKD63DUcC9h"
    10. }
    11. }
    12. ],
    13. "should": [
    14. {
    15. "match": {
    16. "title": "少年说"
    17. }
    18. }
    19. ]
    20. }
    21. }
    22. }

    总结

    • 本次我主要列举了,我再项目开发中比较常见的命令,当然这个只是官方文档中的一些部分知识点,内容有很多可以先不必全部死记理解命令的使用场景即可。
    • 之前使用ELK收集日志信息,我都是使用的Kibana的可视化界面查询的,但是在实际开发中习惯命令行查询会灵活很多。
    • 本篇主要介绍的是原生命令行操作ElasticSearch,下一篇我们就要使用代码操作Elasticsearch Clients地址
  • 相关阅读:
    RedisTemplate操作Redis
    198. 打家劫舍
    判断二叉树是否是平衡二叉树(c#)
    javascript的数组对象常用方法
    (3DV 2017) SEGCloud: Semantic Segmentation of 3D Point Clouds
    MYSQL高级篇-----查询截取分析,锁机制,主从复制
    facedector-Demo
    网络安全涉及哪些方面?
    Java SE 9 多版本兼容 JAR 包示例
    vscode不能打开终端问题
  • 原文地址:https://blog.csdn.net/weixin_41472521/article/details/126221598