Elasticsearch 的文档 类型和索引
在介绍索引之前,先介绍几个名词。理解他们将有助于你理解索引
一、名词介绍
索引
_index,文档存储的地方,类似于关系型数据中的数据库。
事实上,数据被存储和索引在分片中,索引仅仅是一个把一个或者多个分片分组在一起的逻辑空间。
索引名字必须是全部小写,不允许以下划线开头,不能包含逗号。
类型
_type,对应于关系型数据库中的表。(这个描述其实是不准确的,这里只是为了方便理解,具体区别请移步百度搜索)
每个类型type都有自己的映射或者结构定义,就像传统数据库表中的列一样。类型的映射会告诉ElasticSearch文档如何被索引。
_type的名字可以是大写或者小写,不能包含下划线或者逗号。
映射
映射是指数据在每个字段中的解释说明。
映射机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string,number,boolean,date等)。
_mapping参数指令用于参数某index下某type的映射情况。
不同类型的字段的索引方式是不同的,因此会导致查询结果不同。
ElasticSearch中的数据大致分为两类:确切值,全文文本。这也是ES区别于别的数据库的根本差异。
映射的重要参数:
type:即指定字段的类型;
index:控制字符串以何种方式被索引;analyzed表示全文文本形式,not_analyzed表示确切值形式 ,no表示不索引(即不能被搜索到)。string类型字段的默认值是analyzed。
analyzer:指定分析器(譬如whitespace,simple,english)。
文档
档id是一个字符串,与_index和_type组合时,就可以在ElasticSearch中唯一标识一个文档。创建文档时,可以自定义_id,也可以让ES帮助自动生成。
二、索引管理
1、创建索引
PUT http://localhost:9200/shuidi/
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"company": {
"properties": {
"companyName": {
"type": "text",
"analyzer": "ik_max_word"
},
"companyNameStr": {
"type": "keyword"
},
"companyNameDigest": {
"type": "keyword"
},
"province": {
"type": "keyword"
},
"establishDate": {
"type": "keyword"
},
"companyType": {
"type": "keyword"
},
"legalPerson": {
"type": "keyword"
},
"capital": {
"type": "keyword"
},
"companyCode": {
"type": "keyword"
},
"creditNo": {
"type": "keyword"
},
"authority": {
"type": "keyword"
},
"companyStatus": {
"type": "keyword"
},
"capitalNumber": {
"type": "long"
},
"establishDuration": {
"type": "integer"
},
"subdivideIndustry": {
"type": "keyword"
},
"companyDesc": {
"type": "text",
"analyzer": "ik_max_word"
},
"queryTimes": {
"type": "long"
},
"prefectureCity": {
"type": "keyword"
},
"scoreSort": {
"type": "long"
},
"isClaimed": {
"type": "keyword"
},
"vipLevel": {
"type": "integer"
}
}
}
}
}
mapping增加字段
PUT /test_index/_mapping/test_type
{
"properties": {
"proRemark": {
"type": "string",
"index": "not_analyzed"
}
}
}
2、root object
就是某个 type 对应的 mapping json,包括 properties,matadata(_id,_source,_type),setting(analyzer),其他 setting
1、properties
2、_source
好处:
--查询的时候,直接可以拿到完整的document,不需要先拿document id,再发送一次请求拿document;
--partial update基于_source实现;
--reindex时,直接基于_source实现,不需要从数据库(或者其他外部存储)查询数据再修改;
--可以基于_source定制返回field
--debug query更容易,因为可以直接看到_source
如果不需要上述好处,可以禁用_source
{
"mappings":{
"my_type":{
"_source":{
"enable":false
}
}
}
}
3、_all
将所有field打包在一起,作为一个_all field,建立索引。没有指定任何field进行搜索时,就是使用_all field在搜索。
如果不需要可以禁用
{
"mappings":{
"my_type":{
"_all":{
"enable":false
}
}
}
}
也可以在field级别设置include_in_all filed,设置是否要将field的值包含在_all field中
{
"my_field":{
"include_in_all":false
}
}
3、定制 dynamic 策略
- true:遇到陌生字段,就进行 dynamic mapping
- false:遇到陌生字段,就忽略
- strict:遇到陌生字段,就报错
{
"mappings":{
"my_type":{
"dynamic":"strict",//遇到陌生字段,就报错
"properties:{...}
}
}
}
4、重建索引
一个 field 的设置是不能被修改的,如果要修改一个 field,那么应该重新按照新的 mapping,建立一个index,然后将数据批量查询出来。重新用 bulk api 写入 index 中。
批量查询的时候,建议采用 scroll api,并且采用多线程并发的方式来 reindex 数据,每次 scroll 就查询指定日期的一段数据,交给一个线程即可
三、数据相关操作
数据相关的操作有:
索引一个文档;PUT。
检索文档,检索文档的一部分;GET,以及_source参数。
检索文档是否存在;HEAD(返回200或者404)。
更新整个文档;PUT。
创建新的文档;POST(冲突时返回409)。
删除文档;DELETE(返回200或者404)。
文档局部更新;POST,以及_update参数。
检索多个文档;_mget参数指令,docs数组参数
批量更新;_bulk参数指令,可以包含 create,index,update,delete 动作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论