Elasticsearch(ES)的高级搜索(DSL搜索)(上篇)
1. 概述
之前聊了一下 Elasticsearch(ES)的基本使用,今天我们聊聊 Elasticsearch(ES)的高级搜索(DSL搜索),由于DSL搜索内容比较多,因此分为两篇文章完成。
2. 场景说明
2.1 创建索引同时创建映射
PUT http://192.168.1.11:9200/index_user
参数:
{ "settings":{ "index":{ "number_of_shards":5, "number_of_replicas":0 } }, "mappings" : { "properties":{ "user_id":{ "type":"long" }, "name":{ "type":"text", "analyzer":"ik_max_word" }, "login_name":{ "type":"keyword" }, "age":{ "type":"integer" }, "birthday":{ "type":"date" }, "desc":{ "type":"text", "analyzer":"ik_max_word" }, "head_url":{ "type":"text", "index":false } } } }
2.2 创建文档
此处只举几个例子
POST http://192.168.1.11:9200/index_user/_doc/1
参数:
{ "user_id":"1", "name":"僵尸猎手", "login_name":"jsls", "age":25, "birthday":"1990-03-01", "desc":"我是一名房产经纪人,现在转行了,目前是一名运输工人", "head_url":"https://www.zhuifengren.cn/img/jsls.jpg" }
POST http://192.168.1.11:9200/index_user/_doc/2
参数:
{ "user_id":"2", "name":"夏维尔", "login_name":"xwe", "age":28, "birthday":"1992-06-06", "desc":"我是一名高级开发经理,每天坐地铁上班,在北京住,从不堵车", "head_url":"https://www.zhuifengren.cn/img/xwe.jpg" }
POST http://192.168.1.11:9200/index_user/_doc/3
参数:
{ "user_id":"3", "name":"迪士尼在逃仙柔", "login_name":"dsnzxr", "age":10, "birthday":"2011-06-22", "desc":"我是一名五年级的小学生,每天专车接专车送,中午在学校入伙,食堂菜可好了,上学期期末考试我拿了三好学生奖", "head_url":"https://www.zhuifengren.cn/img/dsnzxr.jpg" }
……………………
3. 高级搜索(DSL搜索)(上篇)
3.1 在url中指定查询条件(非DSL搜索)
GET http://192.168.1.11:9200/index_user/_doc/_search?q=desc:一名&q=age:10
desc 是索引中的一个字段,一名 是需要检索的关键字
age 是索引中的一个字段,10是要查的值
此方式用的比较少。
3.2 DSL基本查询
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "match":{ "desc":"一名" } } }
3.3 文档中是否存在某字段
文档中存在该字段,就会被查出来
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "exists":{ "field":"name" } } }
3.4 查询所有
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "match_all":{} } }
3.5 查询部分字段
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "match_all":{} }, "_source": [ "user_id", "name" ] }
3.6 分页
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "match_all":{} }, "from":0, // 从哪条文档开始,文档下标从 0 开始 "size":10 // 每页多少条文档 }
3.7 term查询
term查询,不会将关键字分词,直接拿来查询。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "term":{ "desc":"一名" } } }
3.8 match查询
match查询,会将关键字先分词,然后用每一个分词去查询,最后将结果取并集。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "match":{ "desc":"一名小学生" } } }
3.9 terms查询
与term查询类似,可以写多个关键字,会用每个关键字去查询,最后将结果取并集。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "terms":{ "desc":[ "一名", "小学生" ] } } }
3.10 match_phrase查询
与match类似,会先将关键字分词,然后用每个分词去查询,但会对文档中分词间的间隔有一定限制,使用slop属性去限制,默认是0,需要小于设置的间隔,才能匹配文档。
例如:slop设置为0,则两个分词在文档中的位置必须是紧挨着,否则无法命中。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "match_phrase":{ "desc":{ "query": "一名 学生", "slop":8 } } } }
3.11 match查询扩展
1)match查询后,结果取交集
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "match":{ "desc": { "query": "一名小学生", "operator": "and" } } } }
2)指定匹配率
指定为整数,意思是文档匹配分词的最小个数,例如设置为3,意思是有关键字中3个分词命中文档就可以被查出来。
指定为百分比,意思是匹配关键字分词的百分比,例如设置为60%,如果关键字分词数量是4,则匹配的关键字分词数除以总数大于60%就可以被查出来。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "match":{ "desc": { "query": "一名小学生", "minimum_should_match":"3" // 或 "minimum_should_match":"60%"
} } } }
3.12 使用id集合查询
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query": { "ids":{ "type":"_doc", "values":["1","3"] } } }
3.13 match的多字段查询
当字段名称写为 "name^10"时,意思是将 name 字段的权重提升10倍,则命中name的文档分数会高,排序会靠前。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{ "query":{ "multi_match":{ "query":"一名小学生 僵尸", "fields":[ "desc", "name" // "name^10" ] } } }
4. 综述
今天简单聊了一下 Elasticsearch(ES)的高级搜索(DSL搜索)的一部分内容,希望可以对大家的工作有所帮助。
欢迎大家帮忙点赞、评论、加关注 :)
关注追风人聊Java,每天更新Java干货。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY