文章目录
- 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字段进行了验证