GET /kibana_sample_data_flights_1/_search
{
}
只用一个查询字符串,你就可以在一个、多个或者 _all 索引库(indices)和一个、多个或者所有types中查询:
GET /kibana_sample_data_flights_*/type1,type2/_search
{
}
注意,kibana_sample_data_flights_*
的星号表示查询所有前缀为kibana_sample_data_flights_
的索引,且type1,type2
表示查询这两个类型的索引。
/_index/_type/_id
GET /kibana_sample_data_flights_1/_doc/_search
{
"from": 0,
"size": 2
}
查询表达式(Query DSL)是一种非常灵活又富有表现力的 查询语言。 空查询(empty search) 在功能上等价于使用 match_all 查询, 正如其名字一样,匹配所有文档:
GET /_search
{
"query": {
"match_all": {}
}
}
完整的查询请求如下:
GET /kibana_sample_data_flights/_doc/_search
{
"from": 0,
"size":2,
"query":{
"match":{
"DestAirportID" : "VE05"
}
}
}
查询语句(Query clauses) 就像一些简单的组合块 ,这些组合块可以彼此之间合并组成更复杂的查询。这些语句可以是如下形式:
GET /kibana_sample_data_flights/_doc/_search
{
"from": 0,
"size":2,
"query":{
"bool":{
"must":{"match":{
"DestAirportID" : "VE05"
}},
"should":{"match":{
"FlightDelay" : true
}}
}
}
}
通过"bool"
和{“must”"must_not""should"
}和{"filter"
}+"range"``"match"
的形式。
比如:
{
"bool": {
"must": { "match": { "tweet": "elasticsearch" }},
"must_not": { "match": { "name": "mary" }},
"should": { "match": { "tweet": "full text" }},
"filter": { "range": { "age" : { "gt" : 30 }} }
}
}
当使用于 查询情况 时,查询就变成了一个“评分”的查询。和不评分的查询类似,也要去判断这个文档是否匹配,同时它还需要判断这个文档匹配的有 多好(匹配程度如何)。 一个评分查询计算每一个文档与此查询的 相关程度,同时将这个相关程度分配给表示相关性的字段 _score
,并且按照相关性对匹配到的文档进行排序。这种相关性的概念是非常适合全文搜索的情况,因为全文搜索几乎没有完全 “正确” 的答案。
不再过多介绍
无论你在任何字段上进行的是全文搜索还是精确查询,match 查询是你可用的标准查询。
如果你在一个全文字段上使用 match 查询,在执行查询前,它将用正确的分析器去分析查询字符串:
{ "match": { "tweet": "About Search" }}
如果在一个精确值的字段上使用它, 例如数字、日期、布尔或者一个 not_analyzed 字符串字段,那么它将会精确匹配给定的值:
{ "match": { "age": 26 }}
{ "match": { "date": "2014-09-01" }}
{ "match": { "public": true }}
{ "match": { "tag": "full_text" }}
multi_match 查询可以在多个字段上执行相同的 match 查询:
{
"multi_match": {
"query": "full text search",
"fields": [ "title", "body" ]
}
}
range 查询找出那些落在指定区间内的数字或者时间:
{
"range": {
"age": {
"gte": 20,
"lt": 30
}
}
}
gt
大于gte
大于等于lt
小于lte
小于等于term 查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串:
{ "term": { "age": 26 }}
{ "term": { "date": "2014-09-01" }}
{ "term": { "public": true }}
{ "term": { "tag": "full_text" }}
terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件:
{ "terms": { "tag": [ "search", "full_text", "nosql" ] }}
exists 查询和 missing 查询被用于查找那些指定字段中有值 (exists) 或无值 (missing) 的文档。这与SQL中的 IS_NULL (missing) 和 NOT IS_NULL (exists) 在本质上具有共性:
{
"exists": {
"field": "title"
}
}
你可以用 bool 查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询。它接收以下参数:
must
must_not
should
filter
{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }}
],
"filter": {
"range": { "date": { "gte": "2014-01-01" }}
}
}
}
查询可以变得非常的复杂,尤其 和不同的分析器与不同的字段映射结合时,理解起来就有点困难了。不过 validate-query API 可以用来验证查询是否合法。/_validate/query?explain
GET /kibana_sample_data_flights/_doc/_validate/query?explain
{
"query":{
"bool":{
"must":{"match":{
"DestAirportID" : "VE05"
}},
"should":{"match":{
"FlightDelay" : true
}}
}
}
}
#! Deprecation: [types removal] Specifying types in validate query requests is deprecated.
{
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"valid" : true,
"explanations" : [
{
"index" : "kibana_sample_data_flights",
"valid" : true,
"explanation" : "+(+DestAirportID:VE05 FlightDelay:T) #*:*"
}
]
}