Elasticsearch教程(2) ES查询语句Query DSL详细教程
2023-09-27 14:26:50 时间
0. 准备好数据
"hits": [
{
"_index": "pigg",
"_type": "_doc",
"_id": "1",
"_score": null,
"_source": {
"name": "盐城冬冬",
"age": 30,
"hometown": "盐城",
"gender": "male",
"interesting": "watching TV"
},
"sort": [
"1"
]
},
{
"_index": "pigg",
"_type": "_doc",
"_id": "2",
"_score": null,
"_source": {
"name": "珣爷",
"age": 28,
"hometown": "徐州",
"gender": "female",
"interesting": "watching movie"
},
"sort": [
"2"
]
},
{
"_index": "pigg",
"_type": "_doc",
"_id": "3",
"_score": null,
"_source": {
"name": "米可",
"age": 1,
"hometown": "苏州",
"gender": "female"
},
"sort": [
"3"
]
}
]
1. 查询部分字段
GET /pigg/_search
{
"_source": ["name", "age"]
}
2. match
#查询interesting匹配"watching TV"
GET /pigg/_search
{
"query": {
"match": {
"interesting": "watching TV"
}
}
}
返回如下:
"hits": [
{
"_index": "pigg",
"_type": "_doc",
"_id": "1",
"_score": 0.5753642,
"_source": {
"name": "盐城冬冬",
"age": 30,
"hometown": "盐城",
"gender": "male",
"interesting": "watching TV"
}
},
{
"_index": "pigg",
"_type": "_doc",
"_id": "2",
"_score": 0.2876821,
"_source": {
"name": "珣爷",
"age": 28,
"hometown": "徐州",
"gender": "female",
"interesting": "watching movie"
}
}
]
看到结果也返回了"interesting"= "watching movie"的数据, 其中id=1的_score要比id=2的要高,
这个说明是匹配的程度,id=1的要比id=2的更加匹配
#查询interesting匹配"TV"或者"moive"
GET /pigg/_search
{
"query": {
"match": {
"interesting": "TV movie"
}
}
}
返回结构如下:
"hits": {
"total": 2,
"max_score": 0.2876821,
"hits": [
{
"_index": "pigg",
"_type": "_doc",
"_id": "2",
"_score": 0.2876821,
"_source": {
"name": "珣爷",
"age": 28,
"hometown": "徐州",
"gender": "femal",
"interesting": "watching movie"
}
},
{
"_index": "pigg",
"_type": "_doc",
"_id": "1",
"_score": 0.2876821,
"_source": {
"name": "盐城冬冬",
"age": 30,
"hometown": "盐城",
"gender": "male",
"interesting": "watching TV"
}
}
]
上面结果命中了2个人, "_score"都是0.2876821,说明匹配度两者相同
#查询age=30的
GET /pigg/_search
{
"query": {
"match": {
"age": 30
}
}
}
3. match_phrase
#短语查询,这个会将"watching TV"作为一个短语去进行匹配查询
GET /pigg/_search
{
"query": {
"match_phrase": {
"interesting": "watching TV"
}
}
}
返回结果如下:
"hits": [
{
"_index": "pigg",
"_type": "_doc",
"_id": "1",
"_score": 0.5753642,
"_source": {
"name": "盐城冬冬",
"age": 30,
"hometown": "盐城",
"gender": "male",
"interesting": "watching TV"
}
}
]
4.must
查询interesting匹配"watching TV",并且gender匹配"female"
GET /pigg/_search
{
"query": {
"bool": {
"must": [
{ "match": { "interesting": "watching TV" }},
{ "match": {"gender": "female" }}
]
}
}
}
返回结果如下:
"hits": [
{
"_index": "pigg",
"_type": "_doc",
"_id": "2",
"_score": 0.5753642,
"_source": {
"name": "珣爷",
"age": 28,
"hometown": "徐州",
"gender": "female",
"interesting": "watching movie"
}
}
]
{ “match”: { “interesting”: “watching TV” }}这条件语句能返回id=1或2的数据
{ “match”: {“gender”: “female” }}这条件语句能返回id=2或3的数据
这两条语句是且的关系,所有最后返回id=2的数据
5. should
5.1查询interesting匹配"watching mobile",或gender匹配"female"
#查询interesting匹配"watching mobile",或gender匹配"female"
GET /pigg/_search
{
"query": {
"bool": {
"should": [
{ "match": { "interesting": "watching mobile" }},
{ "match": {"gender": "female" }}
]
}
}
}
返回结果如下:
"hits": [
{
"_index": "pigg",
"_type": "_doc",
"_id": "2",
"_score": 0.5753642,
"_source": {
"name": "珣爷",
"age": 28,
"hometown": "徐州",
"gender": "female",
"interesting": "watching movie"
}
},
{
"_index": "pigg",
"_type": "_doc",
"_id": "1",
"_score": 0.2876821,
"_source": {
"name": "盐城冬冬",
"age": 30,
"hometown": "盐城",
"gender": "male",
"interesting": "watching TV"
}
},
{
"_index": "pigg",
"_type": "_doc",
"_id": "3",
"_score": 0.2876821,
"_source": {
"name": "米可",
"age": 1,
"hometown": "苏州",
"gender": "female"
}
}
]
从上面结果看,id=2的数据匹配得分最高,另外两个匹配度相同
注意这次查询的是"watching mobile",不是"watching TV"
5.2 minimum_should_match
这个是指或的条件,必须满足多少条,下面的minimum_should_match=2,所以一条都查不到
GET /pigg/_search
{
"query": {
"bool": {
"should": [
{
"range": {
"age": {
"gte": 0,
"lte": 3
}
}
},
{
"match": { "hometown.keyword": "徐州" }
}
],
"minimum_should_match": 2
}
}
}
6. must_not
查询interesting不匹配 “watching TV”,
并且
gender不匹配 “female”
GET /pigg/_search
{
"query": {
"bool": {
"must_not": [
{ "match": {"interesting": "watching movie"} },
{ "match": {"gender": "female"} }
]
}
}
}
查询结果是空的,没有匹配的数据
7. 组合多查询
用SQL表示如下
where gender != ‘male’ and ( (age >= 0 and age <= 3) or hometown = ‘徐州’ )
GET /pigg/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"gender": "male"
}
}
],
"should": [
{
"range": {
"age": {
"gte": 0,
"lte": 3
}
}
},
{
"match": {
"hometown.keyword": "徐州"
}
}
]
}
}
}
返回结果如下:
"hits": [
{
"_index": "pigg",
"_type": "_doc",
"_id": "3",
"_score": 1,
"_source": {
"name": "米可",
"age": 1,
"hometown": "苏州",
"gender": "female"
}
},
{
"_index": "pigg",
"_type": "_doc",
"_id": "2",
"_score": 0.2876821,
"_source": {
"name": "珣爷",
"age": 28,
"hometown": "徐州",
"gender": "female",
"interesting": "watching movie"
}
}
]
8.不影响评分的filter
如果不希望age的比较影响评分,可以放到filter里
GET /pigg/_search
{
"query": {
"bool": {
"must": [
{
"match": {"interesting": "watching TV"}
}
],
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 29
}
}
}
}
}
}
相关文章
- ElasticSearch(ES)和solr的关系和区别
- 当es使用script脚本查询聚合等操作遇到空字段报错问题解决方案
- ES集群状态查看命令
- Es
- Es
- 网络安全系列-XII: Arkime如何将过滤表达式转换为ES查询?
- ElasticSearch入门之es使用shell命令操作索引,curl操作索引 08
- ElasticSearch第十一讲 ES检索评分score以及分数计算逻辑
- ElasticSearch第十二讲 ES 集群脑裂问题
- ElasticSearch第十四讲 ES有条件复杂查询
- ElasticSearch系列二 ES基本使用及文档
- 《OpenGL ES 3.x游戏开发(下卷)》一2.4 展翅飞翔的雄鹰
- 《OpenGL ES 3.x游戏开发(上卷)》一1.3 Hello Android应用程序的开发
- 《OpenGL ES 3.x游戏开发(上卷)》一2.2 简单数据的存储——Preferences
- 《OpenGL ES 3.x游戏开发(上卷)》一2.5 Socket网络通信
- elasticsearch es java api Using Bulk Processor
- 《OpenGL ES应用开发实践指南:Android卷》—— 3.1 加载着色器
- 《OpenGL ES应用开发实践指南:Android卷》—— 3.5 在屏幕上绘制
- ES (ElasticSearch) 简易解读(三)企业级日志分析ELK架构的搭建与使用
- vue These dependencies were not found: * core-js/modules/es.array.iterator in ./node_modules/@babe
- 【OpenGL ES】绘制魔方
- Es ElasticSearch 常用命令
- ES 部署常见问题
- 解决es集群启动完成后报master_not_discovered_exception
- Elasticsearch(009):es中index(索引)的新增、修改、删除、关闭等操作