使用情况
过滤情况(filtering context):对文档进行过滤
查询情况(query context):对文档进行评分
过滤查询的结果较少,结果会被缓存到内存中。评分查询计算较多(计算相关性),不会缓存。
通常的规则是,使用查询(query)语句来进行 全文 搜索或者其它任何需要影响 相关性得分 的搜索。除此以外的情况都使用过滤(filters)。
查询简单的匹配所有文档,它经常与 filter 结合使用
{ "match_all": {}}
无论你在任何字段上进行的是全文搜索还是精确查询,match
查询是你可用的标准查询。
match 会进行分词
{ "match": { "tweet": "About Search" }}
multi_match
查询可以在多个字段上执行相同的 match
查询
{
"multi_match": {
"query": "full text search",
"fields": [ "title", "body" ] // 对 title、body 字段进行查询
}
}
range
查询找出那些落在指定区间内的数字或者时间
gt
:大于
gte
:大于等于
lt
:小于
lte
:小于等于
{
"range": {
"age": {
"gte": 20,
"lt": 30
}
}
}
term
查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed
的字符串
{ "term": { "age": 26 }}
{ "term": { "date": "2014-09-01" }}
{ "term": { "public": true }}
{ "term": { "tag": "full_text" }}
允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件
{ "terms": { "tag": [ "search", "full_text", "nosql" ] }}
exists
查询和 missing
查询被用于查找那些指定字段中有值 (exists
) 或无值 (missing
) 的文档。这与 SQL 中的 IS_NULL
(missing
) 和 NOT IS_NULL
(exists
) 在本质上具有共性
{
"exists": {
"field": "title"
}
}
这些查询经常用于某个字段有值的情况和某个字段缺值的情况。
布尔查询:将多查询组合成单一查询
接收参数:
must
:文档 必须 匹配这些条件才能被包含进来
must_not
:文档 必须不 匹配这些条件才能被包含进来
should
:如果满足这些语句中的任意语句,将增加 _score
,否则,无任何影响。它们主要用于修正每个文档的相关性得分
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" }}
}
}
}
也可以通过将布尔查询放到 filter 下实现多标准的过滤,并且不参与评分计算
{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }}
],
"filter": {
"bool": {
"must": [
{ "range": { "date": { "gte": "2014-01-01" }}},
{ "range": { "price": { "lte": 29.99 }}}
],
"must_not": [
{ "term": { "category": "ebooks" }}
]
}
}
}
}
constant_score
查询将一个不变的常量评分应用于所有匹配的文档,可以用来取代只有 filter 语句的布尔查询
{
"constant_score": {
"filter": {
"term": { "category": "ebooks" }
}
}
}
{
"filter": {
"bool": {
"must": {
"term": { "category": "ebooks" }
}
}
}
}
通过 validate-query
API 可以用来验证查询是否合法
GET /gb/tweet/_validate/query?explain
{
"query": {
"tweet" : {
"match" : "really powerful"
}
}
}