Elasticsearch DSL查询语法入门级
DSL查询类型:(1)叶子查询 (2)复合查询
基本语法
GET /_search
{
"query": <query clause>
}
空查询
没有查询条件的查询,就是空查询。它会匹配所有的文档
(1)
GET /_search
(2)
GET /_search { "query": {} }
(3)
GET /_search
{
"query": {
"match_all": {}
}
}
查询与过滤
DSL查询根据使用目的不同,分为两种类型:
- 上下文查询(Query context),简称查询
- 上下文过滤(Filter context),简称过滤
查询(Query)
在上下文查询语镜中,查询语句会询问文档与查询语句的匹配程度,此外,它会判断文档是否匹配并计算相关性评分(_score)的值
过滤(Filter)
在上下文过滤语镜中,查询语句主要解决文档是否匹配问题,而不会在意匹配程度(相关性评分)。过滤主要用于结构化数据。
例如:
status 字段的值是否为某个枚举值或布尔值?
age 字段的值是否在 20-35 范围内?
date 字段的值是否在 2016-2019 之间?
一般来说,过滤语句比查询语句的执行效率更高,因为它不用计算文档的相关性评分(score)。
使用频繁的过滤语句的结果集会被 Elasticsearch 自动缓存,以提高性能。
过滤的目的就是粗暴地快速缩小匹配的结果集。
通常,全文搜索或需要用到相关性评分(score)的场景采用查询(query),其他的全部用过滤(filter)。
在进行搜索时,我们常常会在查询语句中,结合查询和过滤来达到我们的查询目的。
下面是一个示例:
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
全文查询
全文查询语句通常用于全文本字段的查询
match
match查询可操作文本、数值和日期类型的数据,分析它们并构建查询语句
示例:查询full_name字段中包含John或Smith的文档
GET /_search
{
"query" : {
"match" : {
"full_name" : "John Smith"
}
}
}
说明: Elasticsearch 会先使用分析器分析 “John Smith” 为两个独立的项 “John” 和 “Smith”,然后再去构建查询。
这里的 full_name 字段可以替换为任何你想查询的字段甚至是 _all 字段。
match 属于 boolean 的类型,也就是说,分析器会对提供的查询文本进行分析并构建 boolean 查询语句。
由 match 构建的 boolean 查询语句默认是逻辑或(or),当然,我们可以通过 operator 参数来改变这个默认行为。
示例:查询 full_name 字段中包含 John 和 Smith 的文档。
GET /_search
{
"query": {
"match" : {
"full_name" : {
"query" : "John Smith",
"operator" : "and"
}
}
}
}
说明: full_name 是字段名称,query 参数的值是提供的查询文本,operator 参数用于设置 match 的逻辑(or 还是 and)
match_phrase
match_phrase,即短语(词组)匹配,它会分析提供的查询文本并构建一个 phrase 查询。
match_phrase 用于精准的 phase 匹配。
示例:查询 full_name 字段中包含 “John Smith” 短语的文档。
GET /_search
{
"query" : {
"match_phrase" : {
"full_name" : "John Smith"
}
}
}
我们也可以给提供的查询文本指定 analyzer(分析器),如果没有指定,默认使用字段的显式 mapping 中的定义,或者默认的 search analyzer。
GET /_search
{
"query": {
"match_phrase" : {
"full_name" : {
"query" : "John Smith",
"analyzer" : "standard"
}
}
}
}
match_phrase_prefix
match_phrase_prefix 和 match_phrase 类似,但 match_phrase_prefix 不是精准匹配,而是前缀匹配,它会对查询文本的最后一个字符后的内容进行通配符搜索。
示例:查询 full_name 字段中以 “John Smi” 短语开头的文档。
GET /_search
{
"query" : {
"match_phrase_prefix" : {
"full_name" : "John Smi"
}
}
}
multi_match
multi_match 用于多字段匹配查询。
GET /_search
{
"query" : {
"multi_match": {
"query": "John Smith",
"fields": ["first_name", "full_name"]
}
}
}
Term-level 查询
我们知道,全文查询在执行查询之前,会先对提供的查询文本进行分析。
然而,Term-level 查询是直接查询倒排索引中的确切的值。
Term-level 查询通常用于结构化的数据,如数值、日期、枚举值或关键字,而不是文本(text)。
term
term 用于查询指定字段的倒排索引包含某个确切值的记录。
POST /_search
{
"query": {
"term" : { "first_name" : "john" }
}
}
terms
terms 和 term 类似,只不过提供的确切的值是数组。类似于 MySQL 的 in 条件。
POST /_search
{
"query": {
"terms" : { "full_name" : ["john", "john2"] }
}
}
POST /_search
{
"query": {
"constant_score": {
"filter": { "terms" : { "full_name" : ["john", "john2"] }}
}
}
}
range
range 用于范围查询
GET /_search
{
"query": {
"range" : {
"info.age" : {
"gte" : 28,
"lt" : 60,
"boost" : 2.0
}
}
}
}
说明: boost 参数可用于调整相关性评分(score)的值。
GET /_search
{
"query": {
"range" : {
"date" : {
"gt" : "now-3d/d",
"lt" : "now"
}
}
}
}
exists
exists 返回字段值不为 null 的记录。
GET /_search
{
"query":{
"exists":{"field":"user"}
}
}
prefix
prefix 返回字段的 term 以确切的前缀(前缀不会被分析)开头的记录。
GET /_search
{
"query": {
"prefix" : { "full_name" : "joh" }
}
}