Elasticsearch-3-花式查询

新增

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT indexName/typeName/id
{
json数据
}



POST indexName/typeName
{
json数据
}

# 如果不指定id的话 es会自动分配一个id

示例

下面添加了6个电影信息,索引名称是movies,类型名称是movie

1
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
47
PUT 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
2
GET [index_name]/[type_name]/_search 
# index_name和type_name都是可选的

示例
1
2
3
GET _search  //搜索所有索引和所有类型。
GET movies/_search //在电影索引中搜索所有类型
GET movies/movie/_search //在电影索引中显式搜索电影类型的文档

query DSL

DSL: Domain Specified Language ,特定领域的语言
http request body: 请求体,可以用json格式来构建查询语法,比较方便,可以构建各种复杂语法.

查询所有的电影
1
2
3
4
GET movies/movie/_search
{
"query": {"match_all": {}}
}
查询名称包含kill的电影,同时年份按照降序排序
1
2
3
4
5
6
7
8
9
10
11
12
13
GET movies/movie/_search
{
"query": {
"match": {
"title": "kill"
}
},
"sort": [
{
"year": "desc"
}
]
}
分页查询,假设每页显示一条数据,现在查询第二页
1
2
3
4
5
6
GET movies/movie/_search
{
"query": {"match_all": {}},
"from": 1,
"size": 1
}
指定查询出来的电影只要名称和年份
1
2
3
4
5
GET movies/movie/_search
{
"query": {"match_all": {}},
"_source": ["title","year"]
}

query filter 过滤器

查询电影名称包含kill,而且年份大于2000年的电影
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GET /movies/movie/_search
{
"query": {
"bool": {
"must":{
"match": {
"title": "kill"
}
},
"filter": {
"range": {
"year": {
"gt": 2000
}
}
}
}
}
}

full-text search (全文检索)

1
2
3
4
5
6
GET /movies/movie/_search
{
"query": {"match": {
"title": "Kill Bill Lawrence"
}}
}

首先 将 /movies/movie/下面的所有数据的title的值拆分,建立倒排索引,然后搜索关键字会被拆分为Kill和Bill和Lawrence 然后在倒排索引中检索对应的数据

全文检索会将输入的关键字拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回

phrase search 短语搜索

1
2
3
4
5
6
7
8
GET /movies/movie/_search
{
"query": {
"match_phrase": {
"title": "kill"
}
}
}

跟全文检索相反,要求输入关键字 必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能做为返回结果.
比如 查询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的时间范围内,将搜索到的所有结果直接返回给客户端,不需要等数据全部查到后返回,确保一次搜索请求可以在指定的时间内完成,为一些时间敏感的搜索应用提供良好的支持

代码地址

代码地址