- 当把数据用es索引以后,可以通过_search结尾的请求来进行搜索,使用es的DSL在请求体中指定搜索条件
可以在请求URI中指定要搜索的索引名称,默认会响应命中的10个文档,
以下是搜索全部,使用match_all
GET /customer/_search
{
"query":{"match_all":{}},
"sort":[fe'w
{"age":"desc"}
]
}
得到以下查询结果
{
"took" : 1, //查询响应时间,默认是毫秒
"timed_out" : false, //请求是否超时
"_shards" : { //搜索了多少分片,多少成功、失败或者跳过
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : { //找到多少个匹配的文档
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : null, //找到相关文件的分数
"hits" : [
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_score" : null, //文档相关性得分(使用match_all时不适用)
"_source" : {
"name" : "Jared",
"age" : 29
},
"sort" : [ //文档排序位置,不按相关排序分数
29
]
},
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "2",
"_score" : null,
"_source" : {
"name" : "Jared",
"age" : 16
},
"sort" : [
16
]
}
]
}
}
每一个请求都是独立的,es不维护任何状态信息,要翻页搜索,需要使用from
和size
在请求中。
GET /customer/_search
{
"query":{"match_all":{}},
"sort":[
{"age":"desc"}
],
"from":1, //从xx开始
"size":1 //选取几个
}
通过特定的字段去搜索使用match
,标识该字段是否包含xx或者yy,或者关系
GET /customer/_search
{
"query":{"match":{"age":"16 19"}}
}
匹配固定单词使用match_phrase
,and关系
GET /customer/_search
{
"query":{"match_phrase":{"name":"Zhang L"}}
}
复杂查询需要在前面加bool
,可以定义必须匹配must match、可以匹配should match、一定不允许匹配must not match
GET /customer/_search
{
"query":{
"bool":{
"must":[
{"match":{"age":"16"}}
],
"must_not":[
{"match":{"name":"liu"}}
]
}
}
}
must、should和must_not都被称为查询子句
must、should会增加查询评分,分数越高文档岳父和搜索条件、must_not也被视为filter
,直接影响查询文档是否包含在结果中,可以直接在语句中使用filter来包含或者过滤文档,对文档评分没影响
GET /customer/_search
{
"query":{
"bool":{
"must":{"match_all":{}},
"filter":{
"range": {
"age": {
"gte": 20,
"lte": 30
}
}
}
}
}
}