文章目录
- Getting Started
- match_all查询全部
- sort排序
- from\size分页
- _source指定字段
- match匹配查询
- match_phrase短语匹配
- multi_match多字段匹配
- range范围查询
- bool复合查询
- must必须匹配,可贡献得分
- must_not必须不匹配,可贡献得分
- should可有可无,可贡献得分,不影响记录数
- filter条件再过滤,不贡献得分
- term和match
- match_phrase 和 .keyword
Query DSL:Elasticsearch 提供了一个可以执行查询的JSON 风格的 DSL (domain-specific language 领域特定语言)。这个被称为 Query DSL。
ES 支持两种基本方式检索,通俗的讲第二种检索方式的请求体就是DSL语言
- 一个是通过使用 REST request URI 发送检索参数(ur+检索参数)
- 另一个是通过使用 REST request body 来发送它们(uri+请求体)
接下来的实验操作都是基于测试数据(account.json)进行的。
Getting Started
match_all查询全部
GET /bank/_search
{
"query":{
"match_all": {}
}
}
sort排序
query:指定查询的条件
sort:进行排序
GET /bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"FIELD": {
"order": "desc"
}
}
]
}

from\size分页
默认每次查询10条数据,可以使用from和size指定每页的记录数,下面的DSL表示每页查询5条数据,这是第一页
from=(pageNum-1) * pageSize
GET /bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"balance": {
"order": "asc"
}
}
],
"from": 0,
"size": 5
}
_source指定字段
"_source"可以指定结果集中只显示哪些字段
GET /bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"balance": {
"order": "asc"
}
}
],
"_source": ["firstname","lastname","gender"],
"from": 5,
"size": 5
}

match匹配查询
基本语法如下所示:
GET /bank/_search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}
- 如果
match匹配非字符串字段,那么就是精确查询 - 如果
match匹配字符串字段,那么就是模糊查询,也叫全文检索
# 匹配非字符串字段,就是精确查询
GET /bank/_search
{
"query": {
"match": {
"account_number": 20
}
}
}
# 匹配字符串字段,就是模糊查询
# 查询出19条数据,它是分词查询,这些记录按照各自的评分进行排序
GET /bank/_search
{
"query": {
"match": {
"address": "mill lane"
}
}
}
match_phrase短语匹配
前面使用match匹配查询"address": "mill lane"它是进行的分词查询,如下图

但有时候就需要将mill lane作为一个整体(短语)进行匹配,这个时候就可以使用match_phrase进行匹配,它会将mill lane作为整体,只要Value中包含mill lane就会被匹配成功
GET /bank/_search
{
"query": {
"match_phrase": {
"address": "mill lane"
}
}
}

multi_match多字段匹配
比如期望查询出address或state这两个字段中都包含mill,就好比SQL的如下语句
select * from table_name where address like `%mill%` or state like `%mill%`
基本语法格式如下所示;其中query用来指定匹配的值,fields用来指定将从哪些字段中去匹配该值
GET /bank/_search
{
"query": {
"multi_match": {
"query": "",
"fields": []
}
}
}

多字段匹配的时候会不会进行分词查询呢?

range范围查询
基本格式
GET bank/_search
{
"query": {"range": {
"FIELD": {
"gte": 10,
"lte": 20
}
}}
}
bool复合查询
bool用来做复合查询;复合语句可以合并任何其他查询语句,包括复合语句,了解这一点很重要的,这就意味着,复合语句之间可以相互嵌套,可以表达非常复杂的逻辑
must必须匹配,可贡献得分
must:必须达到must列举的所有条件,并将有助于得分
期望查询出gender=’M‘并且address中包含’mill‘的记录
# select * from table_name where gender='M' and address like '%mill%'
GET bank/_search
{
"query": {
"bool": {
"must": [
{"match": {"gender": "M"}},
{"match": {"address": "mill"}}
]
}
},
"_source": ["gender","address"]
}

must_not必须不匹配,可贡献得分
记录一下格式,注意层级格式
# gender=‘M’ and address like '%mill%' and age <> 28
GET bank/_search
{
"query": {
"bool": {
"must": [
{"match": {"gender": "M"}},
{"match": {"address": "mill"}}
],
"must_not": [
{"match": {"age": 28}}
]
}
},
"_source": ["gender","address","age"]
}

should可有可无,可贡献得分,不影响记录数
should:表示可有可无,如果匹配上就会提高该记录的得分,如果没有匹配上也不会影响查询结果集的数量

filter条件再过滤,不贡献得分
前面的must、must_not筛选出满足条件的记录,并贡献得分;should不会对满足must、must_not的记录数产生任何影响,但是它会对匹配should条件的记录贡献得分;而filter却不会贡献得分,只会在must、must_not的基础上对结果进行再过滤。
如下;在满足must的基础上,再筛选出age大于10并且小于30的记录
GET bank/_search
{
"query": {
"bool": {
"must": [
{"match": {"gender": "M"}},
{"match": {"address": "mill"}}
],
"filter": [
{"range": {
"age": {
"gte": 10,
"lte": 30
}
}}
]
}
},
"_source": ["age","lastname","address"]
}

term和match
term 和 match 一样。匹配某个属性的值。只是全文检素(text)字段用 match,其他非text 字段匹配用 term。

match_phrase 和 .keyword
match_phrase:只要包含该短语就会被匹配上***.keyword: 必须是精确匹配
下图使用address字段进行了验证




















