0%

ElasticSearch-Search Template 和 Index Alias

1. Search Template

在开发初期,虽然可以明确查询参数,但是往往还不能最终定义查询的 DSL 的具体结构。可以通过定义一个查询模板达到程序解耦的效果。

假设目前存在如下索引 tmdb:

1
2
3
4
5
PUT tmdb/_doc/1
{
"title": "Apple",
"overview": "a basketball"
}

我们可以通过如下 scripts 脚本定义查询模板,其中 表示输入的查询文本所表示的变量 q,POST _scripts/tmdb 中的 tmdb 自行定义,其表示脚本 ID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
POST _scripts/tmdb
{
"script": {
"lang": "mustache",
"source": {
"_source": [
"title","overview"
],
"size": 20,
"query": {
"multi_match": {
"query": "{{q}}",
"fields": ["title","overview"]
}
}
}
}
}

定义好查询模板之后,我们便可以通过如下 DSL 查询:

1
2
3
4
5
6
7
POST tmdb/_search/template
{
"id":"tmdb",
"params": {
"q": "basketball with cartoon aliens"
}
}

2. Index Alias

Index Alias 支持对已存在的索引关联一个别名,后续可以通过别名查询该索引的数据,我们先使用索引 movies-2019 存入如下两条数据:

1
2
3
4
5
6
7
8
9
10
11
PUT movies-2019/_doc/1
{
"name":"the matrix",
"rating":5
}

PUT movies-2019/_doc/2
{
"name":"Speed",
"rating":3
}

接着为索引使用一个别名 movies-latest,后续即可使用别名进行查询 movies-latest:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
POST _aliases
{
"actions": [
{
"add": {
"index": "movies-2019",
"alias": "movies-latest"
}
}
]
}

// 使用别名查询
POST movies-latest/_search
{
"query": {
"match_all": {}
}
}

另外,我们也可以在为索引关联一个别名时设置过滤条件,例如对 rating 字段增加一个范围查询条件,rating 的值需要大于等于 4:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
POST _aliases
{
"actions": [
{
"add": {
"index": "movies-2019",
"alias": "movies-lastest-highrate",
"filter": {
"range": {
"rating": {
"gte": 4
}
}
}
}
}
]
}
------ 本文结束------