热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

elasticsearch从入门到入门系列(三)搜索大汇总

1.term的多种查询介绍:单词级别的查询这些查询通常用于结构化的查询,比如:number,date,keyword等,而

1.term的多种查询

  • 介绍:
    • 单词级别的查询
    • 这些查询通常用于结构化的查询,比如:number,date,keyword等,而不是text
    • 也就是说,全⽂本查询之前要先对⽂本内容进⾏分词,⽽单词级别的查询直接在相应字段的
      反向索引中精确查找,单词级别的查询⼀般⽤于数值、⽇期等类型的字段上
  • Term Query精确匹配查询(查找号码为23的球员)

请求:POST nba/_search{"query": {"term": {"jerseyNo": "23"}}}

  • Exsit Query 在特定的字段中查找⾮空值的⽂档(查找队名⾮空的球员)

请求:POST nba/_search{"query": {"exists": {"field": "teamNameEn"}}}

  • Prefix Query 查找包含带有指定前缀term的⽂档(查找队名以Rock开头的球员)

请求:POST nba/_search{"query":{"prefix":{"teamNameEn" : "Rock"}}}

  • Wildcard Query ⽀持通配符查询,*表示任意字符,?表示任意单个字符(查找⽕箭队的球员)

POST nba/_search{"query": {"wildcard": {"teamNameEn": "Ro*s"}}
}

  • Regexp Query 正则表达式查询(查找⽕箭队的球员)

POST nba/_search{"query": {"regexp": {"teamNameEn": "Ro.*s"}}
}

  • Ids Query(查找id为1和2的球员)

POST nba/_search{"query": {"ids": {"values": [1, 2]}}
}

2.es的范围搜索

  • 查找指定字段在指定范围内包含值(⽇期、数字或字符串)的⽂档。
    • 查找在nba打了2年到10年以内的球员

POST nba/_search{"query": {"range": {"playYear": {"gte": 2, "lte": 10}}}
}

3.es的布尔查询

  • 布尔查询

typedescription
must必须出现在匹配⽂档中
filter必须出现在⽂档中,但是不打分
must_not不能出现在⽂档中
should应该出现在⽂档中

  • must(查找名字叫做james的球员)

POST /nba/_search{"query": {"bool": {"must": [{"match": {"displayNameEn": "james"}}]}}
}

  • 效果同must,但是不打分(查找名字叫做James的球员)

POST /nba/_search{"query": {"bool": {"filter": [{"match": {"displayNameEn": "james"}}]}}
}

  • must_not (查找名字叫做James的⻄部球员)

POST /nba/_search{"query": {"bool": {"must": [{"match": {"displayNameEn": "james"}}], "must_not": [{"term": {"teamConferenceEn": {"value": "Eastern"}}}]}}
}

  • should(查找名字叫做James的打球时间应该在11到20年⻄部球员)
    • 即使匹配不到也返回,只是评分不同

POST /nba/_search{"query": {"bool": {"must": [{"match": {"displayNameEn": "james"}}], "must_not": [{"term": {"teamConferenceEn": {"value": "Eastern"}}}], "should": [{"range": {"playYear": {"gte": 11, "lte": 20}}}]}}
}

  • 如果minimum_should_match=1,则变成要查出名字叫做James的打球时间在11到20年⻄部 球员

POST /nba/_search{"query": {"bool": {"must": [{"match": {"displayNameEn": "james"}}], "must_not": [{"term": {"teamConferenceEn": {"value": "Eastern"}}}], "should": [{"range": {"playYear": {"gte": 11, "lte": 20}}}], "minimum_should_match": 1}}
}

4.es的排序查询

  • ⽕箭队中按打球时间从⼤到⼩排序的球员

POST nba/_search{"query": {"match": {"teamNameEn": "Rockets"}}, "sort": [{"playYear": {"order": "desc"}}]
}

  • ⽕箭队中按打球时间从⼤到⼩,如果年龄相同则按照身⾼从⾼到低排序的球员

POST nba/_search{"query": {"match": {"teamNameEn": "Rockets"}}, "sort": [{"playYear": {"order": "desc"}}, {"heightValue": {"order": "asc"}}]
}

5.es聚合查询之指标聚合

  • ES聚合分析是什么
    • 聚合分析是数据库中重要的功能特性,完成对⼀个查询的数据集中数据的聚合计算,如:找 出某字段(或计算表达式的结果)的最⼤值、最⼩值,计算和、平均值等。ES作为搜索引擎 兼数据库,同样提供了强⼤的聚合分析能⼒。
    • 对⼀个数据集求最⼤、最⼩、和、平均值等指标的聚合,在ES中称为指标聚合
    • ⽽关系型数据库中除了有聚合函数外,还可以对查询出的数据进⾏分组group by,再在组上 进⾏指标聚合。在ES中称为桶聚合
  • max min sum avg
    • 求出火箭队球员的平均年龄

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"avgAge": {"avg": {"field": "age"}}}, "size": 0
}

  • value_count 统计⾮空字段的⽂档数
    • 求出⽕箭队中球员打球时间不为空的数量

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"countPlayerYear": {"value_count": {"field": "playYear"}}}, "size": 0
}

  • 查出⽕箭队有多少名球员

POST nba/_count{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}
}

  • Cardinality 值去重计数
    • 查出⽕箭队中年龄不同的数量

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"counAget": {"cardinality": {"field": "age"}}}, "size": 0
}

  • stats 统计count max min avg sum 5个值
    • 查出⽕箭队球员的年龄stats

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"statsAge": {"stats": {"field": "age"}}}, "size": 0
}

  • Extended stats ⽐stats多4个统计结果: 平⽅和、⽅差、标准差、平均值加/减两个标准差的区间
    • 查出⽕箭队球员的年龄Extend stats

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"extendStatsAge": {"extended_stats": {"field": "age"}}}, "size": 0
}

  • Percentiles 占⽐百分位对应的值统计,默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值
    • 查出⽕箭的球员的年龄占⽐

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"pecentAge": {"percentiles": {"field": "age"}}}, "size": 0
}

  • 查出⽕箭的球员的年龄占⽐(指定分位值)

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"percentAge": {"percentiles": {"field": "age", "percents": [20, 50, 75]}}}, "size": 0
}

6.es聚合查询之桶聚合

  • Terms Aggregation 根据字段项分组聚合
    • ⽕箭队根据年龄进⾏分组

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"aggsAge": {"terms": {"field": "age", "size": 10}}}, "size": 0
}

  • order 分组聚合排序
    • ⽕箭队根据年龄进⾏分组,分组信息通过年龄从⼤到⼩排序 (通过指定字段)

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"aggsAge": {"terms": {"field": "age", "size": 10, "order": {"_key": "desc"}}}}, "size": 0
}

  • ⽕箭队根据年龄进⾏分组,分组信息通过⽂档数从⼤到⼩排序 (通过⽂档数)

POST /nba/_search{"query": {"term": {"teamNameEn": {"value": "Rockets"}}}, "aggs": {"aggsAge": {"terms": {"field": "age", "size": 10, "order": {"_count": "desc"}}}}, "size": 0
}

  • 每⽀球队按该队所有球员的平均年龄进⾏分组排序 (通过分组指标值)

POST /nba/_search{"aggs": {"aggsTeamName": {"terms": {"field": "teamNameEn", "size": 30, "order": {"avgAge": "desc"}}, "aggs": {"avgAge": {"avg": {"field": "age"}}}}}, "size": 0
}

  • 筛选分组聚合
    • 湖⼈和⽕箭队按球队平均年龄进⾏分组排序 (指定值列表)

POST /nba/_search{"aggs": {"aggsTeamName": {"terms": {"field": "teamNameEn", "include": ["Lakers", "Rockets", "Warriors"], "exclude": ["Warriors"], "size": 30, "order": {"avgAge": "desc"}}, "aggs": {"avgAge": {"avg": {"field": "age"}}}}}, "size": 0
}

  • 湖⼈和⽕箭队按球队平均年龄进⾏分组排序 (正则表达式匹配值)

POST /nba/_search{"aggs": {"aggsTeamName": {"terms": {"field": "teamNameEn", "include": "Lakers|Ro.*|Warriors.*", "exclude": "Warriors", "size": 30, "order": {"avgAge": "desc"}}, "aggs": {"avgAge": {"avg": {"field": "age"}}}}}, "size": 0
}

  • Range Aggregation 范围分组聚合
    • NBA球员年龄按20,20-35,35这样分组

POST /nba/_search{"aggs": {"ageRange": {"range": {"field": "age", "ranges": [{"to": 20}, {"from": 20, "to": 35}, {"from": 35}]}}}, "size": 0
}

  • NBA球员年龄按20,20-35,35这样分组 (起别名)

POST /nba/_search{"aggs": {"ageRange": {"range": {"field": "age", "ranges": [{"to": 20, "key": "A"}, {"from": 20, "to": 35, "key": "B"}, {"from": 35, "key": "C"}]}}}, "size": 0
}

  • Date Range Aggregation 时间范围分组聚合
    • NBA球员按出⽣年⽉分组

POST /nba/_search{"aggs": {"birthDayRange": {"date_range": {"field": "birthDay", "format": "MM-yyy", "ranges": [{"to": "01-1989"}, {"from": "01-1989", "to": "01-1999"}, {"from": "01-1999", "to": "01-2009"}, {"from": "01-2009"}]}}}, "size": 0
}

  • Date Histogram Aggregation 时间柱状图聚合
    • 按天、⽉、年等进⾏聚合统计。可按 year (1y), quarter (1q), month (1M), week (1w), day (1d), hour (1h), minute (1m), second (1s) 间隔聚合
    • NBA球员按出⽣年分组

POST /nba/_search{"aggs": {"birthday_aggs": {"date_histogram": {"field": "birthDay", "format": "yyyy", "interval": "year"}}}, "size": 0
}

7.es之query_string查询

  • 介绍:query_string 查询,如果熟悉lucene的查询语法,我们可以直接⽤lucene查询语法写⼀个查 询串进⾏查询,ES中接到请求后,通过查询解析器,解析查询串⽣成对应的查询。
  • 指定单个字段查询

POST /nba/_search{"query": {"query_string": {"default_field": "displayNameEn", "query": "james OR curry"}}, "size": 100
}

  • 指定多个字段查询

POST /nba/_search{"query": {"query_string": {"fields": ["displayNameEn", "teamNameEn"], "query": "James AND Rockets"}}, "size": 100
}

 


推荐阅读
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 本文探讨了如何在Sitecore 9环境中通过Postman使用API密钥发送请求,包括解决常见错误的方法。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍如何通过Java代码调用阿里云短信服务API来实现短信验证码的发送功能,包括必要的依赖添加和关键代码示例。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文介绍了如何使用 Python 的 Pyglet 库加载并显示图像。Pyglet 是一个用于开发图形用户界面应用的强大工具,特别适用于游戏和多媒体项目。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
author-avatar
mobiledu2502853623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有