类比关系型数据库
DSL(Domain Specific Language特定领域语言)语法
查询表达式
查询格式
- 一个查询子句一般使用这种结构:
{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
- 指向一个指定的字段:
{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
1. 叶查询子句(Leaf query clauses)
它们在特定字段中查找特定值
2. 复合查询子句(Compund query clauses)
这些查询是叶查询子句和其他复合查询的组合,用于提取所需的信息。
两种结构化语句
过滤语句
- term
term 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)。
{ "term": { "age": 26 }}
{ "term": { "date": "2014-09-01" }}
{ "term": { "public": true }}
{ "term": { "tag": "full_text" }}
- terms
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:
{
"terms": {
"tag": [ "search", "full_text", "nosql" ]
}
}
- range
范围查找,操作符包含:- gt :: 大于
- gte :: 大于等于
- lt :: 小于
- lte :: 小于等于
{
"range": {
"age": {
"gte": 20,
"lt": 30
}
}
}
- exists 和 missing
exists 文档中包含指定字段, missing 文档中没有包含某个字段,类似于SQL语句中的 IS_NULL 条件
{
"exists": {
"field": "title"
}
}
这两个过滤只是针对已经查出一批数据来,但是想区分出某个字段是否存在的时候使用
- bool
合并多个过滤条件查询结果,包含操作符:- must :: 多个查询条件的完全匹配,相当于 and 。
- must_not :: 多个查询条件的相反匹配,相当于 not 。
- should :: 至少有一个查询条件匹配, 相当于 or 。
{
"bool": {
"must": { "term": { "folder": "inbox" }},
"must_not": { "term": { "tag": "spam" }},
"should": [
{ "term": { "starred": true }},
{ "term": { "unread": true }}
]
}
}
查询语句
- match_all
查询到所有文档,是没有查询条件下的默认语句。
{
match_all:{}
}
- match
查询关注的是相关性,而过滤关注为是否符合条件。
一般使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句