标签:词条 创建数据库 就会 mapping ace epo 方式 不同 license
原文:Elasticsearch入门教程(三):Elasticsearch索引&映射
通常说的索引有两种词性,名称和动词。
索引的命名必须是全部小写,不能以下划线开头.
创建索引可以显式创建,也可以隐式创建。
显式创建可以根据具体情况对索引进行配置,而且对于中文分词es是默认采用的分词是适合英文并适合中文的,可以在创建索引的时候自己指定分词器。
注意:不同的数据类型索引的方式有稍许不同,如date何text类型不一样,date采用精确匹配,text采用全文检索方式。对于数组,es并没有专门的数组类型。任何域都可以包含0、1或者多个值,就像全文域分析得到多个词条。这暗示 数组中所有的值必须是相同数据类型的。
映射就是创建索引时指定都包含哪些字段以及字段的数据类型、分词器等一些设置。
字段设置参数
ik分词器 https://github.com/medcl/elasticsearch-analysis-ik 支持自定义热词配置(如 香菇 蓝瘦 帅的一逼 等)
// 默认standard,内置的分析器有whitespace 、 simple 和 english
// ik支持两种分词器:ik_max_word,ik_smart
// 分析器:用于测试分词的数据
GET /_analyze
{
"analyzer" : "ik_max_word",
"text": "美国留给伊拉克的是个烂摊子吗"
}
settings用于设置索引的分片数量、副本数量、默认的分词器等,Elasticsearch 提供了优化好的默认配置。 除非你理解这些配置的作用并且知道为什么要去修改,否则不要随意修改。
// 创建只有 一个主分片,没有副本的小索引:
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
}
索引别名就像一个快捷方式或软连接,或者是一个指向,都是最终指的同一个东西,别名 带给我们极大的灵活性,允许我们做下面这些:
有两种方式管理别名: _alias用于单个操作, _aliases用于执行多个原子级操作。
Mapping一旦创建是不允许修改字段的数据类型的,为了防止以后有可能修改索引的情况,刚开始创建索引时最好就为该索引创建一个别名,然后在程序中直接使用别名,而不使用真实的索引名称。
如果后面需要要修改映射,可以再创建一个新的索引,然后把之前索引里的数据导入到新创建的索引里, 为新索引增加一个别名,将别名从老索引中移除,这样应用程序仍然使用的是别名,而这个别名已经指向了新的索引,这样就达到了不修改索引名而修改索引的目的。
// 0. 创建索引(age的类型为long)
PUT /school_v1
{
"mappings": {
"students": {
"properties": {
"name": { "type": "text" },
"age": {"type": "long"}
}
}
}
}
// 1. 为索引创建一个别名
PUT /school_v1/_alias/school
// 查看别名指向的索引
GET /*/_alias/school
// 查询索引对应的别名
GET /school_v1/_alias/*
// 2.创建一个新的索引,名字不能和之前的不一样,这次将age的数据类型改为short
PUT /school_v2
{
"mappings": {
"students": {
"properties": {
"name": { "type": "text" },
"age": {"type": "short"}
}
}
}
}
// 3.迁移数据:将之前的索引里的文档迁移到新的索引上
// 先将数据批量查询出来,然后批量插入
GET /school/students/_search?scroll=1m
POST /schools/students/_bulk
{"index": {"_id": 1}}
{"name": "张三","age": 27}
{"index": {"_id": 2}}
{"name": "小明","age": 28}
GET /schools/students/_search
// 4.为新索引增加别名,别名名称为老索引名称,这样系统可以直接使用老索引的名称来操作新索引
POST /_aliases
{
"actions": [
{
"add": { "index": "school_v2", "alias": "school"},
"remove": { "index": "school_v1", "alias": "school"}
}
]
}
GET /school/students/_search
别名就是索引的另一个名字,就像人的姓名和笔名一样,都是指向的同一个人,可以通过POST /_aliases 路径对别名进行add、remove操作
TIP: 在你的应用中使用别名而不是索引名。然后你就可以在任何时候重建索引。别名的开销很小,应该广泛使用。
创建索引
PUT /{index}
// 注意:当前创建的索引的动态映射配置根对象是不允许添加新字段的,动态映射类型为严格类型,但是内部对象是允许添加新字段的
PUT /shop_v1
{
"aliases": {
"shop": {}
},
"settings" : {
"number_of_shards" : 5,
"number_of_replicas" : 1,
"refresh_interval": "1s",
"analysis" : {
"analyzer" : {
"ik" : {
"tokenizer" : "ik_max_word"
}
}
}
},
"mappings": {
"goods": {
"dynamic": "strict",
"dynamic_templates":[
{ "date": {
"match": "*_date",
"match_mapping_type": "date",
"mapping": {
"type": "date",
"format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}},
{ "ik": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}}
],
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"price": {
"type": "double"
},
"quantity": {
"type": "integer"
},
"colors": {
"type": "keyword"
},
"is_discount": {
"type": "boolean"
},
"create_date": {
"type": "date",
"format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"ip_addr": {
"type": "ip"
},
"location": {
"type": "geo_point",
"lat_lon": true
},
"merchant": {
"type": "object",
"dynamic": true,
"properties": {
"id": { "type": "long" },
"shop_name": { "type": "text" }
}
},
"cpu": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
refresh_interval:索引刷新时间间隔,一个持续时间值, 例如 1s(1 秒) 或 2m(2 分钟)。 一个绝对值1表示的是1毫秒 –无疑会使你的集群陷入瘫痪, -1:表示关闭刷新, 默认为一秒,如果索引了一个文档然后立即尝试搜索它,但却没有搜到,可能是还没有到间隔时间,还没有刷新
查看所有索引 GET /_cat/indices?v&pretty
查看某个索引 GET /{index}
删除索引单个索引 DELETE /{index}
删除所有索引 DELETE /_all 或者 DELETE /*
删除多个索引: DELETE /index1,index2 或者 DELETE /index*
查看索引的映射 GET /{index}/_mapping
查看某个索引的某个类型的映射 GET /{index}/_mapping/{type}
映射添加新字段 PUT /{index}/_mapping/{type}
PUT /shop/_mapping/goods
{
"properties": {
"params": {
"type": "nested",
"properties": {
"id": { "type": "long" },
"label": { "type": "text" },
"value": { "type": "text" }
}
}
}
}
// 插入一条文档
POST /shop/goods
{
"name": "【特别尺码】女装 棉混纺休闲针织衫(长袖) 407767 优衣库UNIQLO",
"price": 149.00,
"quantity": 100,
"colors": ["乳白色", "红色", "黄色"],
"is_discount": true,
"create_date": "2018-01-31 12:10:30",
"ip_addr": "192.168.1.1",
"location": "41.12,-71.34",
"merchant": {
"id": 1111,
"shop_name": "优衣库官方旗舰店"
},
"params": [
{"id": 1, "label":"货号", "value": "7525001123"},
{"id": 2, "label":"品牌", "value": "Cache Cache"}
]
}
查询文档 /{index}/{type}/_search
GET /shop/goods/_search
```
// 创建索引
PUT /school
{
"mappings": {
"students": {
"properties": {
"name": { "type": "text" },
"age": {"type": "long"}
}
}
}
}
// 插入一条文档
PUT /school/students/1
{
"name": "张三",
"age": 27
}
// 查询映射
GET school/_mapping/students
// 添加文档,增加一个新字段height身高
PUT /school/students/2
{
"name": "小明",
"age": 28,
"height": 1.80
}
GET school/_mapping/students
// 查看映射可以看到自动将height作为float类型添加到映射里面
"height": {"type": "float"}
尽管可以增加新的类型到索引中,或者增加新的字段到类型中,但是不能添加新的分析器或者对现有的字段做改动。 如果你那么做的话,结果就是那些已经被索引的数据就不正确, 搜索也不能正常工作。
对现有数据的这类改变最简单的办法就是重新索引:用新的设置创建新的索引并把文档从旧的索引复制到新的索引。
为了有效的重新索引所有在旧的索引中的文档,用 scroll 从旧的索引检索批量文档 , 然后用 bulk API 把文档推送到新的索引中。
同时并行运行多个重建索引任务,但是你显然不希望结果有重叠。正确的做法是按日期或者时间 这样的字段作为过滤条件把大的重建索引分成小的任务:
GET /old_index/_search?scroll=1m
{
"query": {
"range": {
"date": {
"gte": "2014-01-01",
"lt": "2014-02-01"
}
}
},
"sort": ["_doc"],
"size": 1000
}
如果旧的索引持续会有变化,你希望新的索引中也包括那些新加的文档。那就可以对新加的文档做重新索引, 但还是要用日期类字段过滤来匹配那些新加的文档。
通过创建新的索引,将数据重新迁移到新索引中,这种变相的更改索引的配置的方式的缺点是改变了原索引的名称(索引名称不允许重复,新索引就要使用新的索引名)。
Elasticsearch入门教程(三):Elasticsearch索引&映射
标签:词条 创建数据库 就会 mapping ace epo 方式 不同 license
原文地址:https://www.cnblogs.com/lonelyxmas/p/11865847.html