使用search template
对于ES可以理解为一个NoSQL的容器,应用来访问和调用的过程。对于搜索引擎来讲,一般的项目所有业务搜索场景都是相对明确的。是否可以做到ES的复杂json业务处理,由ES来做,前端不关心ES的json的语法格式来做到搜索引擎和前端解耦?使用模版结构。
模版结构可以应用到所有的索引上,所以创建的时候不加索引,template是模版名,可以自定义
POST /_scripts/templatename
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"username": {
"query": "{{nick_value}}",
"analyzer": "{{nick_analyzer}}"
}
}
}
}
}
}
获得模版:GET /_scripts/templatename
删除模版: DELETE /_scripts/templatename
调用模版进行查询: GET /index_customer/_search/template
{
"id": "templatename",
"params": {
"nick_value": "张三",
"nick_analyzer": "ik_max_word"
}
}
给field增加分词器
POST /index_customer/_mapping
{
"properties": {
"username": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"pinyin": {
"type": "text",
"analyzer": "pinyin"
}
}
}
}
}
添加分词器后就进行搜索,在添加分词器之前的数据是搜不到的, ES索引中的数据,是在导入是就进行了分词,而不是在查询的时候才进行分词。
解决方法:现有index进行自更新
POST /index_customer/_update_by_query
这样就可以正常查询了
reindex&index alias功能分析使用
reindex:
-
我们一个index在创建好mapping后不能对type进行修改,原来是keyword我想改成text?
-
比如我们的存储不够了,加入了新的机器进入集群,主分片我想增加怎么办?
这个时候就需要使用reindex,相当于索引复制的概念。
如果你的新索引没有手工创建mapping,那么ES会根据数据来自动生成mapping:
POST /_reindex
{
"source": {
"index": "index_customer"
},
"dest": {
"index": "index_customer1"
}
}
如果新的index里本来就有数据,希望设定为没有才写,有的话版本冲突
POST /_reindex
{
"source": {
"index": "index_customer"
},
"dest": {
"index": "index_customer1",
"op_type": "create"
}
}
如果跨集群进行索引复制,将索引从集群A复制到集群B,这个要在B集群上执行,要给soure设置白名单,在B集群的elasticsearch.yml文件里,reindex.remote.whitelist: "192.168.0.100:9200,192.168.0.101:9200"
POST /_reindex
{
"source": {
"remote": {
"host": "http://192.168.0.100:9200"
},
"index": "index_customer",
"query": {
"match": {
"username": "张三"
}
},
"size": 100
},
"dest": {
"index": "index_customer1",
"op_type": "create"
}
}
reindex的支持异步操作,会返回一个taskId
POST /_reindex?wait_for_completion=false
来源:oschina
链接:https://my.oschina.net/u/4080405/blog/4289241