在这里插入图片描述

前言

  • 本文为es常见DSL搜索入门帖子
  • 开始之前先贴个对应关系,方便各位理解
  • 在es7+的版本中,是没有类型的概念的,所以,添加数据直接在索引中添加;
    在这里插入图片描述

⭐请求es地址均为localhost:9200/{索引}/_search,为了编写方便些,在下面的例子中会直接写请求体;

⭐搜索所有文档

{
    "query": {
        "match_all": {}
    },
    "size": 1 // size关键词为返回数据条数,不填写默认为10条
}

⭐根据指定字段倒序排列

{
    "query": {
        "match_all": {}
    },
    "sort": [
        {
            "patient_age": {
                "order": "desc" // 根据用户年龄倒序排列
            }
        }
    ],
    "size": 10, // size 与 from搭配起到分页的作用
    "from": 1
}

⭐查询返回指定字段

{
    "query": {
        "match_all": {}
    },
    "_source": ["bill_no", "patient_age"], // 只返回订单号和用户年龄
    "sort": [
        {
            "patient_age": {
                "order": "desc"
            }
        }
    ],
    "size": 10,
    "from": 1
}

⭐范围查询(range)

{
    "query": {
        "range": {
            "patient_age": { // 查询年龄大于1岁 小于10岁的用户
                "gte": 1,
                "lte": 10
            }
        }
    }
}

⭐前缀查询(prefix)

{
    "query": {
        "prefix": {
            "patient_name": {
                "value": "李" // 查询姓李的用户
            }
        }
    }
}

⭐组合查询(bool)

  • bool 关键字: 用来组合多个条件实现复杂查询表达式
  • ​ must: 相当于 &&
  • should: 相当于 ||
  • must_not: 相当于 !=

以下表达式的意思为:

  1. 查询用户年龄(patient_age)在0-18岁之间
  2. 且不姓李的用户信息
  3. 并且按照用户年龄字段倒序排列
  4. 并且返回指定字段的用户信息
{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "patient_age": {
                            "gte": 0,
                            "lte": 18
                        }
                    }
                }
            ],
            "must_not": [
                {
                    "prefix": {
                        "patient_name": {
                            "value": "李"
                        }
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "patient_age": {
                "order": "desc"
            }
        }
    ],
    "_source": [
        "bill_no",
        "patient_name",
        "patient_age"
    ]
}

⭐高亮查询(term、highlight)

  • term 查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串;
{
    "query": {
        "term": {
            "patient_name": {
                "value": "李" 
            }
        }
    },
    "highlight": {
        "fields": {
            "*": {}
        }
    }
}

在返回值中,符合条件的数据会被highlight标签包裹,并且有标签修饰,不过这个标签是可以通过es进行修改的;

"highlight": {
    "patient_name": [
        "<em>李</em>雪"
    ]
}

⭐ terms 查询

  • terms 查询和 term 查询一样,但它允许你指定多值进行匹配;
  • 如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件
{
    "query": {
        "terms": {
            "patient_name": [ // 查询患者名字中包含 赵 钱 孙字符的文档
                "赵",
                "钱",
                "孙"
            ]
        }
    }
}

⭐多字段查询(multi_match)

{
    "query": {
        "multi_match": {
            "query": "山东",
            "fields": [
                "patient_address", // 这里为检索的字段
                "address"
            ]
        }
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐