• (十)ElasticSearch高级使用【别名,重建索引,refresh操作,高亮查询,查询建议】


    1.别名使用

    1)别名作用

    在开发中,随着业务需求的迭代,较⽼的业务逻辑就要⾯临更新甚⾄是重构,⽽对于es来说,为了
    适应新的业务逻辑,可能就要对原有的索引做⼀些修改,⽐如对某些字段做调整,甚⾄是重建索
    引。⽽做这些操作的时候,可能会对业务造成影响,甚⾄是停机调整等问题。由此,es提供了索引
    别名来解决这些问题。 索引别名就像⼀个快捷⽅式或是软连接,可以指向⼀个或多个索引,也可
    以给任意⼀个需要索引名的API来使⽤。别名的应⽤为程序提供了极⼤地灵活性

    2)别名使用

    查询

    GET /_alias
    
    • 1

    创建别名

    POST /_aliases
    {
      "actions": [
        {
          "add": {
            "index": "my_data_index",
            "alias": "current_data"
          }
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    删除别名

    POST /_aliases
    {
      "actions": [
        {
          "remove": {
            "index": "my_data_index",
            "alias": "current_data"
          }
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.重建索引

    在 Elasticsearch 中,重建索引是一项重要的操作,通常用于更新或优化现有索引。以下是有关如何执行重建索引的一些建议和步骤:

    1)备份数据

    在执行重建索引之前,确保你有原始索引的备份。这是因为重建索引会创建一个新的索引,然后将数据从旧索引复制到新索引。如果出现问题,你可以回滚到原始索引。

    2)创建新索引

    首先,你需要创建一个新的索引,用于存储重新索引后的数据。你可以使用 Elasticsearch 的索引模板和设置来定义新索引的配置,确保它符合你的需求。

    PUT /new_index
    {
      "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1
      },
      "mappings": {
        "_doc": {
          "properties": {
            "field1": { "type": "text" },
            "field2": { "type": "keyword" }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3)执行重建

    使用 Elasticsearch 的 Reindex API:这是一种安全的方法,它允许你从旧索引到新索引复制数据,并提供了一些高级选项来处理数据转换和过滤等任务。

    POST /_reindex
    {
      "source": {
        "index": "old_index"
      },
      "dest": {
        "index": "new_index"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用 Logstash 或其他 ETL 工具:如果你有复杂的数据转换需求,可以考虑使用 Logstash 或其他 ETL(Extract, Transform, Load)工具来从旧索引导出数据并将其导入新索引

    4)测试和验证

    在执行重建操作后,务必进行测试和验证以确保新索引中的数据与旧索引中的数据一致。你可以执行一些查询和聚合操作,以验证数据的准确性。

    5)更新别名

    一旦你验证了新索引中的数据,可以更新别名,将其指向新索引,以便应用程序可以开始使用新索引中的数据。

    POST /_aliases
    {
      "actions": [
        {
          "remove": {
            "index": "old_index",
            "alias": "my_alias"
          }
        },
        {
          "add": {
            "index": "new_index",
            "alias": "my_alias"
          }
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    6)清理旧索引

    一旦你确认新索引正常工作,可以考虑删除或归档旧索引,以释放磁盘空间并减轻集群负载。

    3.refresh操作

    在 Elasticsearch 中,refresh 操作用于使新索引数据在搜索前立即可见。默认情况下,Elasticsearch 具有自动刷新机制,索引每秒自动刷新一次,以使新的文档和更改对搜索可见。

    修改默认更新时间(默认时间是1s,-1为关闭)

    PUT /star/_settings
    {
     "index": {
     "refresh_interval": "5s"
     }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    有时你可能需要手动执行 refresh 操作以确保最新的数据立即可用。

    POST /my_index/_refresh
    
    • 1

    4.es高亮查询

    在执行搜索查询时,你可以使用 highlight 参数来请求高亮信息。以下是一个简单的示例:

    1)高亮查询

    GET /my_index/_search
    {
      "query": {
        "match": {
          "content": "关键词"
        }
      },
      "highlight": {
        "fields": {
          "content": {} // 高亮的字段
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在上面的示例中,我们执行了一个简单的全文搜索查询,目标是 content 字段中包含关键词 “关键词” 的文档。高亮信息将包含在响应中。

    2)解析高亮结果

    在查询结果中,你将看到一个名为 highlight 的部分,它包含了高亮信息。你可以从中提取高亮的文本以及它们的位置。

    "hits": {
      "total": 3,
      "hits": [
        {
          "_source": {
            "content": "这是包含关键词的文本。"
          },
          "highlight": {
            "content": [
              "这是包含 关键词 的文本。"
            ]
          }
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3)自定义高亮样式

    默认情况下,高亮文本使用 标签标记,但你可以根据需要自定义高亮的样式。你可以在查询中使用 pre_tags 和 post_tags 参数定义前缀和后缀标签。

    "highlight": {
      "fields": {
        "content": {}
      },
      "pre_tags": [""],
      "post_tags": [""]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.es查询建议

    Elasticsearch 提供了几种不同类型的查询建议器,包括 Term Suggester(词语建议器)、Phrase Suggester(短语建议器)和 Completion Suggester(自动完成建议器)。让我分别解释它们的作用和用法:

    1)Term Suggester(词语建议器)

    作用:Term Suggester 用于纠正拼写错误,提供与用户输入的单个词语最接近的建议。
    用法:你可以在查询请求中使用 Term Suggester 来提供词语级别的建议。它通常用于搜索引擎的搜索框,以帮助用户纠正拼写错误并提供相关的建议。
    示例:

    POST /my_index/_search
    {
      "suggest": {
        "my-suggestion": {
          "text": "applle",
          "term": {
            "field": "product_name"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2)Phrase Suggester(短语建议器)

    作用:Phrase Suggester 用于提供纠正的短语或建议,而不仅仅是单个词。
    用法:你可以在查询请求中使用 Phrase Suggester 来提供短语级别的建议。它通常用于搜索引擎的搜索框,以帮助用户在纠正拼写错误的同时提供整个查询短语的建议。
    示例:

    POST /my_index/_search
    {
      "suggest": {
        "my-suggestion": {
          "text": "red bbaloon",
          "phrase": {
            "field": "product_name"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3)Completion Suggester(自动完成建议器)

    作用:Completion Suggester 用于实现自动完成搜索,根据用户输入的一部分提供建议。
    用法:通常在搜索框中,当用户键入查询的一部分时,Completion Suggester 提供可能的建议,以帮助用户更快地完成输入。
    示例:

    POST /my_index/_search
    {
      "suggest": {
        "my-suggestion": {
          "prefix": "app",
          "completion": {
            "field": "product_name.suggest"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    请注意,对于 Completion Suggester,通常需要在索引映射中定义一个专门的 “completion” 字段,以便支持自动完成建议。

  • 相关阅读:
    Pr:脱机文件及处理方法
    【算法leetcode】1442. 形成两个异或相等数组的三元组数目(rust真是好用)
    SSM 高校心理测评系统
    Bogus 实战:使用 Bogus 和 EFCore 生成模拟数据和种子数据【完整教程】
    C++原子变量
    【算法】----选择排序与直接插入排序(java实现)
    10/15/2022
    C++入门指南:类和对象总结笔记(下)
    C++智能指针,强制类型转换
    labview技术交流-判断两个数组的元素是否完全相同
  • 原文地址:https://blog.csdn.net/csdn570566705/article/details/132690126