Elasticsearch——索引配置、模板和重建详解

目录

  • 索引配置、模板和重建
    • 1、获取索引配置
    • 2、更新索引配置
    • 3、索引分析
      • 3.1、测试分析器
      • 3.2、自定义分析器:
      • 3.3、索引分析详情
      • 4、索引模板
        • 4.1、创建索引模板
        • 4.2、删除索引模板
        • 4.3、获取索引模板
        • 4.4、多个模板匹配
        • 5、重建索引
          • 5.1、基本功能
          • 5.2、冲突控制
          • 5.3、查询限制
          • 5.4、复制多个源
          • 5.5、限制数量
          • 5.6、排序

            索引配置、模板和重建

            在Elasticsearch中索引有很多的配置参数,有些配置是可以在建好索引后重新进行设置和管理的,比如索引的副本数量、索引的分词等。

            1、获取索引配置

            索引中包含很多配置参数,可以通过下面命令获取索引的参数配置:

            GET http://127.0.0.1:9200/secisland/_settings
            

            获取索引配置参数的请求格式如下:

            host:port/(index)/_settings
            

            {index}为索引名称,可以接收多种参数格式,*|all|namel,name2…

            过滤配置参数的返回结果:

            GET http://127.0.0.1:9200/secisland/_settings/name=index.number_*
            

            name-index.number*设置将只返回number_of_replicas,number_of_shards两个参数详情。

            2、更新索引配置

            在REST风格的URL设置中设置/settings(所有索引)或者{index}/_settings,可以设置一个或者多个索引,例如:

            请求:

            PUT http:/127.0.0.l:9200/secisland/_settings
            

            参数:

            {"indexx":{"number_of_replicas":4}
            }
            

            更新分词器。创建索引后可以添加新的分析器。添加分析器之前必须先关闭索引,添加之后再打开索引。

            POST http://127.0.0.1:9200/secisland/_close
            PUT http://127.0.0.1:9200/secisland/_settings
            {"analysis": { "analyzer": { "content": {"type":"custom","tokenizer":"whitespace"}
                }
              }
            }
            POST http://127.0.0.1:9200/secisland/_open
            

            3、索引分析

            索引分析(analysis)是这样一个过程:首先,把一个文本块分析成一个个单独的词(term),为了后面的倒排索引做准备。然后标准化这些词为标准形式,提高它们的“可搜索

            性”。这些工作是分析器(analyzers)完成的。一个分析器(analyzers)是一个组合,用于将三个功能放到一起:

            • 字符过滤器:字符串经过字符过滤器(character filter)处理,它们的工作是在标记化之前处理字符串。字符过滤器能够去除HTML标记,或者转换“&”为“and”。
            • 分词器:分词器(tokenizer)被标记化成独立的词。一个简单的分词器(tokenizer)可以根据空格或逗号将单词分开。
            • 标记过滤器:每个词都通过所有标记过滤(token filters)处理,它可以修改词(例如将"Quick"转为小写),去掉词(例如连接词像“a”、“and”、“the”等),或者增加

              词(例如同义词像“jump”和“leap”)。

              Elasticsearch提供很多内置的字符过滤器,分词器和标记过滤器。这些可以组合起来创建自定义的分析器以应对不同的需求。

              3.1、测试分析器

              POST http://127.0.0.1:9200/_analyze
              {"analyzer":"standard",
              	"text":"this is a test"
              }
              

              在该分析器下,将会分析成this,is,a,test四个词。

              3.2、自定义分析器:

              POST http://127.0.0.1:9200/_analyze
              {"tokenizer":"keyword",
              	"token_filters":["lowercase"],
              	"char_filters":["html_strip"],
              	"text":"this is a test"
              }
              

              使用keyword分词器、lowercase分词过滤、字符过滤器是html strip,这3部分构成一个分词器。

              上面示例返回分词结果是this is a test,其中html_strip过滤掉了html字符。

              也可以指定索引进行分词。URL格式如下:

              http://127.0.0.1:9200/secisland/_analyze
              

              3.3、索引分析详情

              如果想获取分析器分析的更多细节,设置explain属性为true(默认为false),将输出分词详情。

              4、索引模板

              4.1、创建索引模板

              PUT  http://127.0.0.1:9200/_template/template_1
              { "template": "te*",
                "settings": {"number_of_shards": 1},
                "mappings": { "type1": { "_source": { "enabled": false
                    }
                  }
                }
              }
              

              定义好模板可使用te*来适配,分片数量为1,默认文档类型为type1,_source的enabled为false。

              4.2、删除索引模板

              DELETE http://127.0.0.1:9200/_template/template_1
              

              4.3、获取索引模板

              GET http://127.0.0.1:9200/_template/template_1
              

              使用通配符或逗号分隔符:

              GET http://127.0.0.1:9200/_template/temp*
              GET http://127.0.0.1:9200/_template/template_1,template_2
              

              获取所有索引模板:

              GET http://127.0.0.1:9200/_template/
              

              判断索引模板是否存在:

              HEAD http://127.0.0.1:9200/_template/template_1
              

              4.4、多个模板匹配

              有这样一种情况:template_1、template2两个模板,使用te*会匹配2个模板,最后合并两个模板的配置。如果配置重复,这时应该设置order属性,order是从0开始的数字,先匹配ordr数字小的,再匹配数字大的,如果有相同的属性配置,后匹配的会覆盖之前的配置。

              5、重建索引

              5.1、基本功能

              重建索引的最基本功能是拷贝文件从一个索引到另一个索引,例如:

              POST /_reindex
              { "source": {"index": "secisland"},
                "dest": {"index": "new_secisland"}
              }
              

              参数说明:

              • took:从开始到结束的整个操作的毫秒数。
              • updated:已成功更新的文档数。
              • created:成功创建的文档数。
              • batches:从重建索引拉回的滚动响应的数量。
              • version_conflicts:重建索引中版本冲突数的数量。
              • failures:所有索引失败的数组。如果这是非空的,则请求将被中止。

                5.2、冲突控制

                由于_reindex是获取源索引的快照,而且目标索引是不同的索引,所以基本上不太可能产生冲突。在接口参数中可以增加dest来进行乐观并发控制。如果version_type设置为

                internal会导致Elasticsearch盲目转储文件到目标索引,任何具有相同类型和ID的文档将被重写。例如:

                POST /_reindex
                { "source": {"index": "secisland"},
                  "dest": { "index": "new_secisland",
                    "version_type": "internal"
                  }
                }
                

                如果设置version_type为external将会导致Elasticsearch保护源索引的版本,如果在目标索引中有一个比源索引旧的版本,则会更新文档。对于源文件中丢失的文档在目标中也会被创建。

                POST /_reindex
                { "source": {"index": "secisland"},
                  "dest": { "index": "new_secisland",
                    "version_type": "external"
                  }
                }
                

                设置op_type为create将导致_reindex在目标索引中仅创建丢失的文件。所有现有的文件将导致版本冲突。

                POST /_reindex
                { "source": {"index": "secisland"},
                  "dest": { "index": "new_secisland",
                    "op_type": "create"
                  }
                }
                

                正常情况下当发生冲突的时候reindex过程将被终止,可以在请求体中设置"conflicts’":“proceed”,可以只进行计算:

                POST /_reindex
                { "source": {"index": "secisland"},
                  "dest": {"index": "new_secisland"},
                  "conflicts":"proceed"
                }
                

                5.3、查询限制

                可以通过向源添加一个类型或者增加一个查询来限制文档的数量,比如只复制类型为secilog,且collect_type字段为syslog的文档:

                POST /_reindex
                { "source": { "index": "secisland",
                    "type":"secilog",
                    "query":{ "term": { "collect_type": { "value": "syslog"
                        }
                      }
                    }
                  },
                  "dest": {"index": "new_secisland"}
                }
                

                5.4、复制多个源

                在请求接口中可以列出源索引和类型,可以在一个接口中复制多个源。例如下面的例子将在secisland和blog索引中的secilog和post类型中拷贝数据,这包括secisland索引中的“secilog”和“post”类型,也包括blog索引中的“secilog”和“post”类型。如果需要更具体的文档可以使用查询。当id产生冲突的时候是没有办法处理的,因为执行的顺序是随机的,所以目标索引将无法确认应该保存哪些文档:

                POST /_reindex
                { "source": { "index": ["secisland", "blog"],
                    "type": ["secilog", "post"]
                  },
                  "dest": {"index": "all_together"}
                }
                

                5.5、限制数量

                也可以通过设置大小来限制处理文档的数量。这只会复制一个文件到new_secisland索引中:

                POST /_reindex
                { "source": {"index": "secisland"},
                  "dest": {"index": "new_secisland"},
                  "size": 1
                }
                

                5.6、排序

                如果你想要复制特定的文档,可以使用排序。排序会降低效率,但在某些情况下,它是有意义的。如果可能的话,可以选择性地查询来确定复制的大小和排序。下面将从secisland索引中复制l0000文档到new_secisland中:

                POST /_reindex
                { "source": {"index": "secisland", "sort":{"date": "desc"}},
                  "dest": {"index": "new_secisland"},
                  "size": 10000
                }