[Elasticsearch] 向已存在的索引中添加自定义filter/analyzer

问题描述

随着应用的不断升级,索引中的类型也会越来越多,新增加的类型中势必会使用到一些自定义的Analyzer。但是通过_settings端点的更新API不能直接在已经存在的索引上使用。在sense中进行更新时会抛出异常:

PUT /symbol
{
  "settings": {
    "analysis": {
      "filter": {
        "edgengram": {
           "type": "edgeNGram",
           "min_gram": "1",
           "max_gram": "255"
        }
      },
      "analyzer": {
        "symbol_analyzer": {
          "type": "custom",
          "char_filter": [],
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "word_delimiter"
          ]
        },
        "back_edge_ngram_analyzer": {
          "type": "custom",
          "char_filter": [],
          "tokenizer": "whitespace",
          "filter": [
            "reverse",
            "edgengram",
            "reverse"
          ]
        }
      }
    }
  }
}

上例中,我们希望向名为symbol的索引中添加一个filter和两个analyzers。但是会抛出如下的错误信息:

{
   "error": "IndexAlreadyExistsException[[symbol] already exists]",
   "status": 400
}

提示我们该索引已经存在了,无法添加。


解决方案

最直观的解决方案是首先备份该索引中已经存在的数据,然后删除它再重建该索引。这种方式比较暴力,当索引中已经存在相当多的数据时,不建议这样做。

另外一种方案是使用_open和_close这一对端点,首先将目标索引关闭,执行需要的更新操作,然后再打开该索引。

POST /symbol/_close

PUT /symbol/_settings
{
  "settings": {
    ....
  }
}

POST /symbol/_open

这样就避免了需要重建索引的麻烦。有了新添加的filter和analyzer,就可以根据需要再对types中的mappings进行更新了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-28 16:39:37

[Elasticsearch] 向已存在的索引中添加自定义filter/analyzer的相关文章

[Elasticsearch] 向已存在的索引中加入自己定义filter/analyzer

问题描写叙述 随着应用的不断升级,索引中的类型也会越来越多,新添加的类型中势必会使用到一些自己定义的Analyzer.可是通过_settings端点的更新API不能直接在已经存在的索引上使用. 在sense中进行更新时会抛出异常: PUT /symbol { "settings": { "analysis": { "filter": { "edgengram": { "type": "edgeNG

elasticsearch迁移数据到新索引中

因为业务原因,需要修改索引的映射的某个字段的类型,比如更改Text为Keyword. 需要如下步骤: 1).先新建索引,映射最新的映射实体 2).迁移老索引的数据到新索引中(数据较大的话,可以分批迁移) 3).删除老索引 下面使用elasticsearch-head插件(安装自行网上搜索)操作 启动elasticsearch和elasticsearch-head,如下图:      1.创建新索引,新索引名为:myindex 2.迁移老索引的数据到新索引中 3.删除老索引即可 注:我net用的客

[Elasticsearch] 控制相关度 (六) - function_score查询中的filter,functions及random_score参数

本章翻译自Elasticsearch官方指南的Looking at Time一章. 时间数据处理(Looking at Time) 如果在ES中,搜索是最常见的行为,那么创建日期柱状图(Date Histogram)肯定是第二常见的.为什么要使用日期柱状图呢? 想象在你的数据中有一个时间戳.数据是什么不重要-Apache日志事件,股票交易日期,棒球比赛时间-任何拥有时间戳的数据都能通过日期柱状图受益.当你有时间戳时,你经常会想创建基于时间的指标信息: 今年的每个月销售了多少辆车? 过去的12小时

Elasticsearch--Date math在索引中的使用

在Elasticsearch,有时要通过索引日期来筛选某段时间的数据,这时就要用到ES提供的日期数学表达式 描述: 特别在日志数据中,只是查询一段时间内的日志数据,这时就可以使用日期数学表达式,这样可以限制检索的索引数量,减少集群的负载,提高系统性能. 几乎所有的API都支持日期索引中的数学参数值. 基于日期数学表达式的索引: <static_name{date_math_expr{date_format|time_zone}}> 其中各个字段的含义是: static_name:索引名字的静态

[转帖]SQL Server 索引中include的魅力(具有包含性列的索引)

SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 上个月刚发现sql2016 之前仅支持 索引包含 16个键 (之后支持32个键) 这个月发现 可以 使用include 的方式来处理. 开文之前首先要讲讲几个概念 [覆盖查询] 当索引包含查询引用的所有列时,它通常称为“覆盖查询”. [索引覆盖] 如果返回的数据列就包含于索引的键值中,或者包含于索引的键

Elasticsearch-基础介绍及索引原理分析

转自 : http://www.cnblogs.com/dreamroute/p/8484457.html 介绍 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作: 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索. 实时分析的分布式搜索引擎. 可以扩展到上百台服务器,处理P

定时器_在.net core3.0 webapi中添加自定义定时器功能

原文:定时器_在.net core3.0 webapi中添加自定义定时器功能 前言:想在.net framework环境使用自定义定时器的话,参考我的另一篇文章:https://www.cnblogs.com/lxhbky/p/10242839.html 想在.net core中使用定时器功能,需要借助一个服务接口:IHostedService,   继承并实现对应方法,最后再setup.cs类中添加注册服务:services.AddHostedService<实现服务类>();   既然要写

非聚集索引中的临界点(Tipping Point)

什么是临界点? 注意,我要说的问题是非聚集索引的执行计划从Seek+Lookup变成Table/Clustered Index Scan的临界点.SQL Server的访问数据的IO最小单元是页. 我们知道聚集索引的叶级是数据页,非聚集索引的叶级是指向数据行的指针.所以通过聚集索引获取数据时,就是直接访问聚集索引本身,而通过非聚集索引获取数据时,除了访问自身,还要通过指针去访问数据页.这个过程就是RID/Key Lookup.而此Lookup是一个单页操作,即每次使用一个RID/Key,然后去访

对mysql联合索引中的字段进行合理排序

在MySQL的where条件中,有时会用到很多的条件,通常为了加快速度会把这些字段放到联合索引中,可以更快的提高搜索速度: 但是对联合索引中字段顺序的合理排序,便更能提高速度 例子:select * from table where (groupid=1000) and (userid=500) and (time=140012345) 建立的索引也通常很随性的就按照where条件中字段的顺序建立 ALTER  TABLE  table  ADD  INDEX g_u_time_index(gr