创建一个索引
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" }}
]
}
网友评论