elasticsearch搜索引擎的常用方法
1、term和terms
term和terms等查询,不会对查询对字段进行分词处理,适合于date、num、id等确切数据进行搜索
如果需要查询keywords,则查询等keywords必须是查询字段中可以分出来的词,如果不是,则无法查询到数据。
例如:age字段包含的值为80后、90后。使用term查询,{"term":{"age":"80后"}} 这样是无法查询到age是"80后"的数据的,因为term不会对"80后"进行分词,而es中存储的age字段,会把"80后"分成“80”和“后”,没有“80后”,所以使用term无法查询到
term查询某一个关键词的数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 查询content含有“学习”关键词的数据 GET index_1/_search { "query" : { "bool" : { "filter" : { "term" : { "content" : "学习" } } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | terms查询某些关键词的数据: # 查询content中含有“学习”和“生活”的数据 GET index_1/_search { "query" : { "bool" : { "filter" : { "terms" : { "content" : [ "学习" , "生活" ] } } } } } |
2、match
match的所有方法,都会对字段进行分词,所查询的字段数据只要包含分词后结果的一个,就会被查询到
例如:age的数据包含有80后、90后,使用 {"match":{"age":"80后"}} 查询,会把所有的数据都查询出来。
分析:match会把“80后”分词为“80”和“后”,而es也会讲age分词为“80“、“后”,“90”、“后”,所有数据都包含”后“,所以会被全部查找出来
match查找age是80后的字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | GET index_1/_search { "query" : { "bool" : { "filter" : { "match" : { "age" : "80后" } } } } } 结果: { "took" : 4 , "timed_out" : false , "_shards" : { "total" : 1 , "successful" : 1 , "failed" : 0 }, "hits" : { "total" : 6433 , "max_score" : 0 , "hits" : [ { "_index" : "index_1" , "_type" : "type_1" , "_id" : "1" , "_score" : 0 , "_source" : { "age" : "70后" ...} }, { "_index" : "index_1" , "_type" : "type_1" , "_id" : "2" , "_score" : 0 , "_source" : { "age" : "80后" ...} }, { "_index" : "index_1" , "_type" : "type_1" , "_id" : "2" , "_score" : 0 , "_source" : { "age" : "90后" ...} } ] } } |
match_phrase:短语匹配查询,必须匹配短语中的所有分词,并且保证各个分词的相对位置不变
例如:age的数据包含有80后、90后,使用 {"match_phrase":{"age":"80后"}} 查询,只会把age字段是“80后”的数据查询出来。
分析:match_phrase会把“80后”分词为“80”和“后”,而es也会讲age分词为“80“、“后”,“90”、“后”,查询的时候,只会查询“80”后面的分词是“后”的数据
match_phrase查找age是80后的字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | GET index_1/_search { "query" : { "bool" : { "filter" : { "match_phrase" : { "age" : "80后" } } } } } 结果: { "took" : 4 , "timed_out" : false , "_shards" : { "total" : 1 , "successful" : 1 , "failed" : 0 }, "hits" : { "total" : 6433 , "max_score" : 0 , "hits" : [ { "_index" : "index_1" , "_type" : "type_1" , "_id" : "1" , "_score" : 0 , "_source" : { "age" : "80后" ...} }, { "_index" : "index_1" , "_type" : "type_1" , "_id" : "2" , "_score" : 0 , "_source" : { "age" : "80后" ...} }, { "_index" : "index_1" , "_type" : "type_1" , "_id" : "2" , "_score" : 0 , "_source" : { "age" : "80后" ...} } ] } } |
multi_match:查询多个字段包含某个关键词的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 查询content或education中含有 "大学" 的数据 GET index_1/_search { "query" : { "bool" : { "filter" : { "multi_match" : { "query" : "大学" , "fields" : [ "content" , "education" ] } } } } } |
match_all:查询所有文档
1 2 3 4 5 6 7 | GET index_1/_search { "query" : { "match_all" : {} } } |
3、range
range范围查找,查找某一范围的所有数据
gt:大于
gte:大于等于
lt:小于
lte:小于等于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 查询时间大于等于 2019 - 08 - 10 10 : 08 : 29 ,小于等于 2019 - 08 - 13 10 : 08 : 29 的数据 GET index_4/_search { "query" : { "bool" : { "filter" : { "range" : { "date" : { "gte" : "2019-08-10 10:08:29" , "lte" : "2019-08-13 10:08:29" } } } } } } |
4、sort
sort按照某些字段对数据进行排序,可以是一个字段,也可以是多个字段
desc:降序
asc:生序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 查询数据按照时间的降序排列 GET index_1/_search { "sort" : [ { "date" : { "order" : "desc" } } ], "query" : { "match_all" : {} } } |
5、_source
对于搜索的结果,只关注某些字段的值
1 2 3 4 5 6 7 8 9 10 | # 查询所有的数据的name和age GET index_1/_search { "_source" : [ "name" , "age" ], "query" : { "match_all" : {} } } |
6、from和size
from:从某个位置开始查询,最小为0,某些情况下可以为-1(下一篇说明)
size:查询长度
from+size不能大于10000,否则es会报错(下一篇解决)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 查询前 20 条数据,并按照date的降序排列 GET index_1/_search { "from" : 0 , "size" : 20 , "sort" : [ { "date" : { "order" : "desc" } } ], "query" : { "match_all" : {} } } |
7、fuzzy
模糊匹配
value:查询包含某关键字
boost:增加查询的权值,默认值是1.0,必须于value同用,涉及字段_score(es默认按照_score排序)
fuzziness:设置匹配的最小相似度,默认值0.5,对于字符串,取值0-1(包括0和1);对于数值,取值可能大于1;对于日期取值为1d,1m等
prefix_length:公共前缀长度,默认为0
max_expansions:指定可被扩大到的最大词条数,默认为无限制
1 2 3 4 5 6 7 8 9 10 11 12 | GET index_4/_search { "query" : { "fuzzy" : { "type" : { "value" : "分期" , "boost" : 0.5 } } } } |
8、wildcard
通配符查询
*:匹配0或多个字符
?:匹配任意字符
注意:使用wildcard的字段类型需要是keyword,切不分词;尽量少用,效率较低
1 2 3 4 5 6 7 8 9 10 11 | GET index_1/_search { "query" : { "wildcard" : { "content" : { "value" : "*学习*" } } } } |
采自于 https://blog.csdn.net/Misaki_root/article/details/101203647?spm=1001.2014.3001.5501
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签