最近一段时间 在es-head 场景下面开始 使用 es dsl 查询语句,最开始接触的时候觉得确实是和 原来的关系数据库sql有一丝区别,这里以学习记录的目的,记录一下查询方法,方便用到时候使用 为了方便了解,每个es 查询增加了一个 对应的 sql 语句 其表名 为 es_table 方便理解
没有条件 只是查询所有的数据
对应sql: select * from es_table
{
"query": {
"match_all": {}
}
}
在最基础的查询的基础上 限制查询条数查询 这个限制为 只查询2条 数据
对应sql: select * from es_table where 1 = 1 limit 2
{
"size": 2,
"query": {
"match_all": {}
}
}
term 里面可以增加自定字段的查询 比如下面的查询为 查询 operate_Week 字段 等于 星期四 的所有数据
对应sql: select * from es_table where operate_Week = “星期四”
{
"query": {
"term": {
"operate_Week": "星期四"
}
}
}
terms 查询某个字段里含有多个关键词的文档 比如下面的查询为 查询 operate_Week 字段 等于 星期四 和 星期五 的所有数据
对应sql: select * from es_table where operate_Week = “星期四” or operate_Week = “星期五”
ps: 这个 terms 同时支持 传一个值
{
"query": {
"terms": {
"operate_Week": [
"星期四",
"星期五"
]
}
}
}
在 ES 当中提供了 bool 查询,一个 bool 查询可以包含一个或多个查询字句,支持以下四种查询:
must:必须匹配,贡献算分
should:选择性匹配,贡献算分
must_not:查询字句,必须不能匹配
filter:必须匹配,不贡献算分
对应sql: select * from es_table where 1 = 1 and operateTime > 2020-01-01 01:01:01 and operateTime < 2021-04-20 10:06:08 and order = 1
{
"query": {
"bool": {
"filter": [
{
"range": {
"operateTime": {
"from": "2020-01-01 01:01:01",
"to": "2021-04-20 10:06:08"
}
}
},
{
"term": {
"order": "1"
}
}
]
}
}
}
通过 should 和 must_not 来进行组合查询
对应sql: select * from es_table where operate_Week = “星期四” or operate_Week = “星期五” and assetGroupName != “全国组” or assetGroupName != “”
{
"query": {
"bool": {
"should": [
{
"terms": {
"operate_Week": [
"星期四",
"星期五"
]
}
}
],
"must_not": [
{
"terms": {
"assetGroupName": [
"全国组",
""
]
}
}
]
}
}
}
在 ES 当中提供了 bool 查询,一个 bool 查询可以包含一个或多个查询字句,支持以下四种查询:
must:必须匹配,贡献算分
should:选择性匹配,贡献算分
must_not:查询字句,必须不能匹配
filter:必须匹配,不贡献算分
对应sql: select * from es_table where 1 = 1 and operateTime > 2020-01-01 01:01:01 and operateTime < 2021-04-20 10:06:08 and order = 1
{
"query": {
"bool": {
"filter": [
{
"range": {
"operateTime": {
"from": "2020-01-01 01:01:01",
"to": "2021-04-20 10:06:08"
}
}
},
{
"term": {
"order": "1"
}
}
]
}
}
}
权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通常来说,搜索商品名称要比商品简介的权重要高。