新增
语法:1
2
3
4
5
6
7
8
9
10
11
12
13PUT indexName/typeName/id
{
json数据
}
或
POST indexName/typeName
{
json数据
}
# 如果不指定id的话 es会自动分配一个id
示例
下面添加了6个电影信息,索引名称是movies,类型名称是movie1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47PUT movies/movie/1
{
"title":"The Godfather",
"director":"Francis Ford Coppola",
"year":1972,
"genres": ["Cirme","Drame"]
}
PUT movies/movie/2
{
"title": "Lawrence of Arabia",
"director": "David Lean",
"year": 1962,
"genres": ["Adventure", "Biography", "Drama"]
}
PUT movies/movie/3
{
"title": "To Kill a Mockingbird",
"director": "Robert Mulligan",
"year": 1962,
"genres": ["Crime", "Drama", "Mystery"]
}
PUT movies/movie/4
{
"title": "Apocalypse Now",
"director": "Francis Ford Coppola",
"year": 1979,
"genres": ["Drama", "War"]
}
PUT movies/movie/5
{
"title": "Kill Bill: Vol. 1",
"director": "Quentin Tarantino",
"year": 2003,
"genres": ["Action", "Crime", "Thriller"]
}
PUT movies/movie/6
{
"title": "The Assassination of Jesse James by the Coward Robert Ford",
"director": "Andrew Dominik",
"year": 2007,
"genres": ["Biography", "Crime", "Drama"]
}
添加完毕之后,通过搜索查询一下这几部电影 (使用_search端点)
语法:1
2GET [index_name]/[type_name]/_search
# index_name和type_name都是可选的
示例
1 | GET _search //搜索所有索引和所有类型。 |
query DSL
DSL: Domain Specified Language ,特定领域的语言
http request body: 请求体,可以用json格式来构建查询语法,比较方便,可以构建各种复杂语法.
查询所有的电影
1 | GET movies/movie/_search |
查询名称包含kill的电影,同时年份按照降序排序
1 | GET movies/movie/_search |
分页查询,假设每页显示一条数据,现在查询第二页
1 | GET movies/movie/_search |
指定查询出来的电影只要名称和年份
1 | GET movies/movie/_search |
query filter 过滤器
查询电影名称包含kill,而且年份大于2000年的电影
1 | GET /movies/movie/_search |
full-text search (全文检索)
1 | GET /movies/movie/_search |
首先 将 /movies/movie/下面的所有数据的title的值拆分,建立倒排索引,然后搜索关键字会被拆分为Kill和Bill和Lawrence 然后在倒排索引中检索对应的数据
全文检索会将输入的关键字拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回
phrase search 短语搜索
1 | GET /movies/movie/_search |
跟全文检索相反,要求输入关键字 必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能做为返回结果.
比如 查询kill 会返回 “Kill Bill: Vol. 1” 和 “To Kill a Mockingbird” 查询kill bill 只会返回 “Kill Bill: Vol. 1”
highlight search 高亮搜索结果
GET /movies/movie/_search
{
“query”: {
“match”: {
“title”: “kill”
}
},
“highlight”: {
“fields”: {
“title”:{}
}
}
}
返回会在 highlight > title 中 将关键字加 <em></em> 标签
搜索结果说明
- took:耗费了几毫秒
- timed_out:是否超时
- _shards:一个搜索请求会达到一个index的所有primary shard上,当然 每个primary shard都可能有一个或多个replica shard,所以请求也可以到primary shard的其中一个replica shard上去,shards fail的条件(primary和replica全部挂掉),不影响其他shard.
- hits.total:查询结果的数量
- hits.max_score:本次搜索的所有结果中,最大的相关度分数是多少,每一条document对于search的相关度,越相关,_score分数越大,排位越靠前
- hits.hits:默认查询前10条数据,完整数据,_score 降序排序
time_out机制详解
查询默认是没有timeout的,可以手动指定1
GET /_search?timeout=10ms
意思就是在timeout的时间范围内,将搜索到的所有结果直接返回给客户端,不需要等数据全部查到后返回,确保一次搜索请求可以在指定的时间内完成,为一些时间敏感的搜索应用提供良好的支持