起因:在项目开发过程中,要使用到搜索 引擎来对一些关键字实现逆向查询,如果仅用模糊搜索,那么搜索的时间会根据数据量的增大而增大,对比之下就学了elasticsearch,也记录一下,常常回顾。
1. search template使用
什么是查询模版?
对于ES来说,你可以把它理解为一个NoSQL的容器,应用来访问和调用的过程,对于搜索引擎来讲,你的所有业务搜索场景是不是都是相对明确的?
能不能做到ES的业务处理,由ES来做,前端不关心ES的json的语法格式来做到搜索引擎和前端解耦
# 模版结构可以应用到所有的索引上
# 所以创建的时候不加索引,tpnick是模版名,可以自定义
POST /_scripts/tpnick
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"nickname": {
"query": "{{nick_value}}",
"analyzer": "{{nick_analyzer}}"
}
}
}
}
}
}
# 获得模版
GET /_scripts/tpnick
# 删除模版
DELETE /_scripts/tpnick
# 调用模版进行查询
GET /index_customer/_search/template
{
"id": "tpnick",
"params": {
"nick_value": "太阳",
"nick_analyzer": "ik_max_word"
}
}
2. field增加分词器update by query
# 场景1: 一个field在使用了一段时间后,发现需要增加新的分词器,比如原来是中文,后面要加pinyin
POST /index_customer/_mapping
{
"properties": {
"nickname": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"pinyin": {
"type": "text",
"analyzer": "pinyin"
}
}
}
}
}
# 添加分词器后就进行搜索,是搜不到数据的
# 分词器在数据加入后增加的,对前面的数据无法进行分词搜索
GET /index_customer/_search
{
"query": {
"match": {
"nickname.pinyin": "taiyang"
}
}
}
# 就要对现有index进行自更新
POST /index_customer/_update_by_query
# 场景2:中文分词器里面,会在数据已经导入后加入新的分词,这个时候这个分词就搜不到以前的数据
# 不是ik分词器的问题,是因为你没有更新索引
# 这里需要注意的点
# ES索引中的数据,是在导入是就进行了分词,而不是在查询的时候才进行分词
3. reindex&index alias功能分析使用
3.1. reindex
场景描述**
-
我们一个index在创建好mapping后不能对type进行修改,原来是keyword我想改成text?
-
比如我们的存储不够了,加入了新的机器进入集群,主分片我想增加怎么办?
# 这个时候就需要使用reindex
# 相当于索引复制的概念
# 如果你的新索引没有手工创建mapping,那么ES会根据数据来自动生成mapping
POST /_reindex
{
"source": {
"index": "index_customer"
},
"dest": {
"index": "index_test"
}
}
# 如果新的index里本来就有数据,希望设定为没有才写,有的话版本冲突
POST /_reindex
{
"source": {
"index": "index_customer"
},
"dest": {
"index": "index_test",
"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": {
"desc": "艾编程"
}
},
"size": 100
},
"dest": {
"index": "index_test1",
"op_type": "create"
}
}
# reindex还可以支持异步操作
POST /_reindex?wait_for_completion=false
# 会返回一个taskId
3.2. index alias
场景描述
-
如果在ES中会横向以时间为维度创建很多索引,比如index_0201,index_0202
-
这个时候前端应用不能因为ES名字改了就修改索引名,这个时候就可以通过别名来统一
-
一个别名节点可以关联多个索引
-
别名也不能和现有索引重复,如果别名重复,数据就合并到一起了
# 添加别名
POST /_aliases
{
"actions": [
{
"add": {
"index": "index_customer",
"alias": "index_user",
"filter": {
"range": {
"consume": {
"gte": 2000
}
}
}
}
}
]
}
# 同时创建多个别名,相当于做个了一个逻辑合并,可以支持分词和相关搜索
{
"actions": [
{
"add": {
"index": "index_test",
"alias": "index_user"
}
},
{
"add": {
"index": "index_test1",
"alias": "index_user"
}
}
]
}
# 删除别名
{
"actions": [
{
"remove": {
"index": "index_test",
"alias": "index_user"
}
},
{
"remove": {
"index": "index_test1",
"alias": "index_user"
}
}
]
}
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!
网友评论