美文网首页
Index Mgmt(management)

Index Mgmt(management)

作者: 潘大的笔记 | 来源:发表于2019-10-24 08:24 被阅读0次

创建一个索引

1、创建索引

PUT /my_index
{
    "settings": { ... any settings ... },
    "mappings": {
        "type_one": { ... any mappings ... },
        "type_two": { ... any mappings ... },
        ...
    }
}

默认情况是自动创建索引,可通过更改每个节点的config/elasticsearch.yml配置来修改

action.auto_create_index: false

2、删除索引
删除多个索引

DELETE /index_one,index_two
DELETE /index_*

删除全部索引

DELETE /_all
DELETE /*

单个命令删除所有数据可能会导致可怕的后果
这个设置使删除只限于特定名称指向的数据,而不允许使用_all或者通配符来删除索引库

action.destructive_requires_name: true

索引设置

number_of_shards 索引的主分片数,默认值是5,索引创建后不能修改
number_of_replicas 主分片的副本数,默认值是1,可以随时修改
PUT /my_temp_index
{
    "settings": {
        "number_of_shards" :   1,
        "number_of_replicas" : 0
    }
}

update-index-settings API 动态修改

PUT /my_temp_index/_settings
{
    "number_of_replicas": 1
}

配置分析器

默认分析器standard,对于大部分西方语系来说是一个不错的选择
1、standard分词器,通过单词边界分割输入的文本
2、standard语汇单元过滤器,目的是整理分词器触发的语汇单元
3、 lowercase语汇单元过滤器,转换所有的语汇单元为小写
4、stop词汇单元过滤器,删除停用词(对搜索相关性影响不大的常用词,例如a 、the)
默认停用词过滤器是关闭的
创建了一个新的分析器,叫做 es_std , 并使用预定义的西班牙语停用词列表

PUT /spanish_docs
{
    "settings": {
        "analysis": {
            "analyzer": {
                "es_std": {
                    "type":      "standard",
                    "stopwords": "_spanish_"
                }
            }
        }
    }
}

可以使用analyze API来对分析器进行测试

GET /spanish_docs/_analyze?analyzer=es_std
El veloz zorro marrón

简化的结果显示西班牙语停用词 El 已被正确的移除:

{
  "tokens" : [
    { "token" :    "veloz",   "position" : 2 },
    { "token" :    "zorro",   "position" : 3 },
    { "token" :    "marrón",  "position" : 4 }
  ]
}

自定义分析器

一个分析器就是在一个包里组合了三种函数的一个包装器,三种函数被顺序执行
1、字符过滤器
用来移除我们不想被索引的字段
2、分词器
把字符串分解成单个词条或者词汇单元
3、词单元过滤器
经过分词,作为结果的词单元流会按照指定的顺序通过指定的词单元过滤器
词单元过滤器可以修改、添加或移除词单元。

创建一个自定义分析器

1、使用 html清除 字符过滤器移除HTML部分。
2、使用一个自定义的 映射 字符过滤器把 & 替换为 " and " 。
3、使用 标准 分词器分词。
4、小写词条,使用 小写 词过滤器处理。
5、使用自定义 停止 词过滤器移除自定义的停止词列表中包含的词。

PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": {
                "&_to_and": {
                    "type":       "mapping",
                    "mappings": [ "&=> and "]
            }},
            "filter": {
                "my_stopwords": {
                    "type":       "stop",
                    "stopwords": [ "the", "a" ]
            }},
            "analyzer": {
                "my_analyzer": {
                    "type":         "custom",
                    "char_filter":  [ "html_strip", "&_to_and" ],
                    "tokenizer":    "standard",
                    "filter":       [ "lowercase", "my_stopwords" ]
            }}
}}}

类型和映射

类型表示一类相似的文档,例如user
映射类似与数据库中的字段

根对象

映射的最高一层被成为根对象,包含:
1、properties节点,列出了文档中可能包含的每个字段的映射
2、元数据字段,_开头,例如_type/_id/_source
3、设置项,控制如何动态处理新的字段,例如analyzer/dynamic_date_formats/dynamic_templates
4、其他设置。可以同时应用在根对象和其他object类型的字段上,例如enabled/dynamic/include_in_all

元数据: _source字段

代表文档体的JSON字符串
意味着:
1、搜索结果包括了整个可用的文档,即不需要额外的从另一个数据仓库获取文档
2、没有_source字段,部分update请求不会生效
3、当映射改变时,需要重新索引数据。有了_source字段可以直接在ES上操作,而不必从另一个数据仓库取数
4、不需要看整个文档时,单个字段可以从_source字段提取和通过get或者search请求返回
5、查询语句更加简单
在搜索请求中,可以通过指定_source参数,来获取指定字段

GET /_search
{
    "query":   { "match_all": {}},
    "_source": [ "title", "created" ]
}

元数据:_all字段

一个把其它字段值当作一个大字符串来索引的特殊字段

元数据:文档标识

1、_id
2、_type
3、_index
4、_uid
_uid字段是被存储(可取回)和索引(搜索)的
_type字段没有存储,被索引
_id/_index 没有被存储,也没有被索引
es使用_uid字段来派生_id

动态映射

当es遇到文档中从未遇到的字段,会用dynamic mapping 来确定字段的数据类型,并自动把新的字段添加到类型映射
1、true 动态添加新的字段(默认)
2、false 忽略新的字段
3、strict 遇到新字段抛出异常

自定义动态映射

1、日期检测
第一次遇到新字段,"2019-10-24",它更像是一个日期,就会以date类型添加
然而第二次同样的字段,值是"test",就会抛出一个异常,可以通过设置
2、动态模版
es :以 _es 结尾的字段名需要使用 spanish 分词器。
en :所有其他字段使用 english 分词器。

PUT /my_index
{
    "mappings": {
        "my_type": {
            "dynamic_templates": [
                { "es": {
                      "match":              "*_es", (1)
                      "match_mapping_type": "string",
                      "mapping": {
                          "type":           "string",
                          "analyzer":       "spanish"
                      }
                }},
                { "en": {
                      "match":              "*", (2)
                      "match_mapping_type": "string",
                      "mapping": {
                          "type":           "string",
                          "analyzer":       "english"
                      }
                }}
            ]
}}}
match_mapping_type:允许你应用模板到特定类型的字段上
match:匹配字段名称
path_match:匹配字段在对象上的完整路径
unmatch:用于未被分配的字段
path_unmatch:用于未被分配的字段

缺省(默认)映射

使用 default 映射为所有的类型禁用 _all 字段, 而只在 blog 类型启用:

PUT /my_index
{
    "mappings": {
        "_default_": {
            "_all": { "enabled":  false }
        },
        "blog": {
            "_all": { "enabled":  true  }
        }
    }
}

重新索引你的数据

尽管可以增加新的字段到类型中,但是不能对新的分析器或者对现有的字段做改动。
这个时候就需要重新索引:用新的设置创建的索引并把文档从旧的索引复制到新的索引
1、使用scroll从旧的索引批量检索文档
2、用bulk文档推送到新的索引中
Reindex API
确的做法是按日期或者时间 这样的字段作为过滤条件把大的重建索引分成小的任务:

GET /old_index/_search?scroll=1m
{
    "query": {
        "range": {
            "date": {
                "gte":  "2014-01-01",
                "lt":   "2014-02-01"
            }
        }
    },
    "sort": ["_doc"],
    "size":  1000
}

如果旧的索引会持续变化,你希望新的索引中也包括那些新加的文档。那就可以对新加的文档做重新索引, 但还是要用日期类字段过滤来匹配那些新加的文档。

索引别名和零停机

1、在允许的集群中可以无缝的从一个索引切换到另一个索引
2、给多个索引分组
3、给索引的一个子集创建视图

_alias:单个操作
_alases:多个原子级别的操作
创建索引:PUT /my_index_v1
设置别名:PUT /my_index_v1/_alias/my_index 
检测别名指向的索引:GET /*/_alias/my_index
检测哪些别名指向这个索引:GET /my_index_v1/_alias/*

索引迁移

POST /_aliases
{
    "actions": [
        { "remove": { "index": "my_index_v1", "alias": "my_index" }},
        { "add":    { "index": "my_index_v2", "alias": "my_index" }}
    ]
}

相关文章

网友评论

      本文标题:Index Mgmt(management)

      本文链接:https://www.haomeiwen.com/subject/geqfvctx.html