1.索引脚本新增字段:
-
描述
user_info_index_2: 索引名称
user_info_index: 索引别名
user:索引名称下的对象节点,必须存在
user.csId: 新增的字段名称
userBase:索引名称下的对象节点,必须存在
csLabel:既实现等于与包含索引检索 -
执行脚本
## 创建索引
PUT user_info_index_2
{
"mappings": {
"user_info_index": {
"properties": {
"user.csId": {
"type": "long",
"null_value": 0
},
"user.csName": {
"type": "keyword",
"null_value":""
},
"userBase.csAmount": {
"type": "double",
"null_value": 0
},
"userBase.csSalary": {
"type": "double",
"null_value": 0
},
"userBase.csTime": {
"type": "date",
"null_value": "-62167420800000",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"userBase.csLabel": {
"type": "text",
"fields": {
"row": {
"type": "keyword",
"null_value": ""
}
},
"analyzer": "ngram_analyzer"
}
}
}
},
"settings": {
"index": {
"number_of_shards": "3",
"routing_partition_size": "1",
"max_inner_result_window": "50000",
"max_result_window": "50000",
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "ngram_tokenizer"
}
},
"tokenizer": {
"ngram_tokenizer": {
"token_chars": [
"letter",
"digit",
"punctuation"
],
"type": "ngram",
"max_gram": "1"
}
}
},
"number_of_replicas": "1"
}
}
}
- 创建索引别名
POST localhost:9200/_aliases
{
"actions":[{
"add":{
"index":"user_info_index_2",
"alias":"user_info_index"
}
}]
}
2.索引关键字
-
term 过滤
term 精确匹配,数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)
如: {"term": {"user.csId": 123}} -
terms 过滤
terms 允许指定多个匹配条件。
如:{"terms": {"user.csId": [123, 456]}} -
range 过滤
range 过滤允许我们按照指定范围查找一批数据:
如:{"range": {"userBase.csTime": {"gte": 1572581133000,"lt":1575129600000}}}
gt: 大于; gte:大于等于; lt : 小于; lte : 小于等于;
- bool 过滤
bool 用来合并多个过滤条件查询结果的布尔逻辑:
must:多个查询条件的完全匹配,相当于 and。
must_not: 多个查询条件的相反匹配,相当于 not;
should:至少有一个查询条件匹配,相当于 or;
3.索引搜索
- 简单的条件搜索
## 查询名称等于张三的数据
GET user_info_index_2/_search
{
"query":{
"term":{
"user.csName":"张三"
}
}
}
##搜索csAmount等于200.5的数据
GET user_info_index_2/_search
{
"query": {
"term": { "userBase.csAmount" : 200.5 }
}
}
##搜索csAmount等于200或211的数据
GET user_info_index_2/_search
{
"query": {
"terms": { "userBase.csAmount" : [200,211] }
}
}
- 通过xpack搜索
## 查询名称等于张三的数据,以JSON格式返回
POST _xpack/sql?format=json
{
"query":"""
select
user.csId,
user.csName
from user_info_index
where user.csName= '张三'
"""
}
## 查询名称不为空的数量,以txt方式返回
POST _xpack/sql?format=txt
{
"query":"""
select
count(1)
from user_info_index
where user.csName is not null
"""
}
- 复杂的条件搜索
##搜索csTime时间范围内,csAmount与csSalary相等的数据
GET user_info_index_2/_search
{
"query": {
"bool": {
"must": [{
"range": {
"userBase.csTime":{
"gt": "1572581133000",
"lt": "1575129600000"
}
}
}],
"filter": [{
"script": {
"script": {
"inline": "doc['userBase.csAmount'].value - doc['userBase.csSalary'].value == 0",
"lang": "painless"
}
}
}],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 10
}
- 删除数据
## 删除名称等于李四的数据
POST user_info_index_2/_delete_by_query
{
"query":{
"term":{
"user.csName":"李四"
}
}
}
注意事项
- ES索引结构字段新增后不可修改字段类型,字段类型确认需要谨慎
- 索引结构中数值类型的默认值设置,将与搜索相关联
索引结构中csAmount字段类型为数值,默认值为0
"userBase.csAmount": {
"type": "double",
"null_value": 0
},
搜索索引脚本
GET user_info_index_2/_search
{
"query": {
"term": { "userBase.csAmount" : 0 }
}
}
查询结果数据空数据也会查询出来
{
"userBase":{
"csAmount":null
}
}
- ES索引升级,切换别名需要停止数据上传,否则变更失败(秒级更新数据量过大出现)
扩展
- 删除索引
DELETE user_info_index_2
- 备份ES结构和数据 | 新结构数据拷贝
POST localhost:9200/_reindex
{
"source": {
"index": "indexName"
},
"dest": {
"index": "newIndexName"
}
}
- 索引升级
1.执行脚本查询索引结构
GET user_info_index_2
2.拷贝出原索引结构JSON进行编辑
1)删除mapping以上所有配置
2)删除索引名
3)删除别名
4)删除settings节点下的【provided_name,creation_date,uuid,version】
3.执行脚本创建索引
PUT user_info_index_3
{
.... 索引的结构JSON格式
}
4.删除原索引的别名
5.为新索引创建别名
6.拷贝老索引的数据至新索引结构
7.数据补偿
网友评论