Elasticsearch常用查询语法及RestClient操作

server/2024/10/17 21:05:09/

DSL Query基本语法

1,查询所有数据matchall(当然并不是会显示所有数据)

#查询所有数据
GET /索引名/_search
{"query": {"查询类型": {"查询条件":"条件值"}}
}

 2,全文搜索检索-分词搜索

match查询:全文检索查询的一种,会对用户内容分词,然后去倒排索引库检索,语法。

#根据条件查询 matchGET /索引名/_search
{"query": {"查询类型": {"查询那个字段": "查询的具体值"}}
}
# 示例
GET /hotel/_search
{"query": {"match": {"all": "北京"}}
}

multi_match:和match类似,但是它允许多个字段进行查询

# 根据多个字段来搜 multi_match
GET /索引名/_search
{"query": {"查询类型": {"query": "需要查询字段的具体值","fields": ["查询字段1","查询字段2"]}}
}# 根据多个字段来搜 multi_match
GET /hotel/_search
{"query": {"multi_match": {"query": "北京","fields": ["city","name"]}}
}

解释:在hotel索引库中按照addressname两个字段搜索值包含北京的文档

3,精准查询

精准查询一般是查找keyword,数值,日期,boolean等不可分割的字段。

term:根据词条精准查询

range:根据值的范围查询

term查询

#精准查询-term
GET /索引名/_search
{"query": {"查询类型": {"查询字段": {"value": "查询的具体值"}}}
}#精准查询-term
GET /hotel/_search
{"query": {"term": {"city": {"value": "上海"}}}
}

解释:在hotel索引库中查找city的值等于上海的所有文档,(city值一定是上海

range查询-范围查询


#精准查询-范围查询range
GET /索引名/_search
{"query": {"查询类型": {"查询字段": {"gte": 最小值,"lte": 最大值}}}
}GET /hotel/_search
{"query": {"range": {"score": {"gte": 10,"lte": 45}}}
}

解释:在hotel索引库中查询score的值大于等于10小于等于45的文档。

4,复合查询

复合查询:复合查询可以将其他简单查询组合起来,实现更复杂的逻辑,例如:

funcation_score:算分函数查询,可以根据某些规则(打分算法)计算文档得分

1,funcation score Query

例如:

#修改得分
GET /hotel/_search
{"query": {"function_score": {"query": {"match": {"all": "北京"}},"functions": [{"filter": {"term": {"brand": "如家"}},"weight": 10}],"boost_mode": "multiply"}}}

解释:查询索引库为hotel索引库,查询字段为all,值为北京,过滤brand为如家的文档,得分方式为默认,乘10.

2,Boolean Query

布尔查询是一个或者多个子句的组合子查询的组合方式有
must:必须匹配每个子查询,类似“与
should:选择性匹配子查询,类似“或
must_not:必须不匹配,不参与算分,类似“非
filter:必须匹配,不参与算分

例如,查询名字包含如家,价格不高于400的酒店

# 使用bool查询功能
GET /hotel/_search
{"query": {"bool": {"must": [{"match": {"name": "如家"}}],"must_not": [{"range": {"range": {"gt": 400}}}]}}
}

使用RestClient进行query查询

建议在上一篇博客基础上进行

RestClient操作Elasticsearch(Java)-CSDN博客文章浏览阅读838次,点赞30次,收藏12次。Es官方提供了各种不用语言的客户端,用来操作Es,这些客户端的本质就是组装DSL语句,通过http请求发送给Es,从而简化操作es基础篇不熟悉参考一下博客:ElasticSearch入门篇-CSDN博客Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。https://blog.csdn.net/qq_63837759/article/details/137755058?spm=1001.2014.3001.5501

全文检索查询-分词搜索

会在倒排索引库中做分词匹配,类似于模糊查询

因为最后的结果需要解析,于是为了后续代码的简洁,我们把解析的代码单独书写出来,这里用的是fastJson:

/***用来解析返回的数据,包含高亮处理(针对的是name字段)* @param searchResponse 发送请求之后的响应*/void parseData( SearchResponse searchResponse){//解析拿到的数据//有用的数据都在这个对象里面SearchHits hits = searchResponse.getHits();//获取数据总数long total = hits.getTotalHits().value;System.out.println("数据总数:"+total);//这个数组里面存放的是每一条数据SearchHit[] searchHits = hits.getHits();for (SearchHit documentFields : searchHits) {String sourceJson = documentFields.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(sourceJson, HotelDoc.class);//进行高亮的结果解析Map<String, HighlightField> highlightFieldMap = documentFields.getHighlightFields();if(!CollectionUtils.isEmpty(highlightFieldMap)){HighlightField highlightField = highlightFieldMap.get("name");if(highlightField!=null){//获取高亮处理后的nameString name = highlightField.fragments()[0].string();hotelDoc.setName(name);}}System.out.println(hotelDoc);}}

1,matchAll查询(查询所有数据,但是只返回十条)

@Testvoid matchAllTest() throws IOException {//1,创建请求SearchRequest request=new SearchRequest("hotel");//2,准备请求参数request.source().query(QueryBuilders.matchAllQuery());//3,发送请求SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);//4,解析拿到的数据parseData(searchResponse);}

2,match查询(根据一个字段进行查询)

/*** match查询,可以指定字段及逆行查询,但是只能指定一个* @throws IOException*/@Testvoid matchTest() throws IOException {//1,创建请求SearchRequest request=new SearchRequest("hotel");//2,准备请求参数,针对all字段,对所有all中包含北京的进查询request.source().query(QueryBuilders.matchQuery("all","北京"));//因为es默认返回十条数据,我们如果向返回多一点,可以设置返回的数量request.source().size(20);//3,发送请求SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);//4,解析拿到的数据parseData(searchResponse);}

3,multi_match:(和match类似,但允许对多个字段进行查询)

/*** multiMatch查询,可以指定多个字段* @throws IOException*/@Testvoid multiMatchTest() throws IOException {SearchRequest request =new SearchRequest("hotel");//指定查询字段的值是多少,并指定那个字段,可以有多个,我们这里指定name,和cityrequest.source().query(QueryBuilders.multiMatchQuery("北京","name","city"));SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);parseData(searchResponse);}

精准查询

精准查询-字段基本上是keyword类型的不可以在分词

term查询

/*** term查询-根据词条精准查询* @throws IOException*/@Testvoid termTest() throws IOException {SearchRequest request =new SearchRequest("hotel");//指定查询字段的值是多少,并指定那个字段,这个查询的值是固定的完全匹配的request.source().query(QueryBuilders.termQuery("city","上海"));SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);parseData(searchResponse);}

range查询

/*** range查询-根据条件范围插寻* @throws IOException*/@Testvoid rangTest() throws IOException {SearchRequest request =new SearchRequest("hotel");//指定词条进行范围插寻,查找评分从20到40 的酒店request.source().query(QueryBuilders.rangeQuery("score").gt(20).lt(40));SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);parseData(searchResponse);}

对查询结果做排序分页

/*** 针对查询结果做排序和分页* @throws IOException*/@Testvoid PageSortTest() throws IOException {int page=3;int size=5;SearchRequest request =new SearchRequest("hotel");//使用matchall查询所有酒店request.source().query(QueryBuilders.matchAllQuery());//对查询结果进行排序和分页,from:第几页。size;每页大小request.source().from((page-1)*size).size(size);//排序,针对价格字段降序,从高到低request.source().sort("price", SortOrder.DESC);SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);parseData(searchResponse);}

对查询结果做高亮处理

/*** 对查询结果高亮处理* @throws IOException*/@Testvoid HignLightTest() throws IOException {SearchRequest request =new SearchRequest("hotel");//指定词条进行范围插寻,查找all字段中包含如家的酒店request.source().query(QueryBuilders.matchQuery("all","如家"));//查询后的name字段高亮处理,可以指定多个字段进行高亮request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);parseData(searchResponse);}

至此,es基础查询完结,了解更多,可查看官方文档!!!

Quick start | Elasticsearch Guide [8.13] | Elasticicon-default.png?t=N7T8https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html


http://www.ppmy.cn/server/7922.html

相关文章

QT sqlite BLOB类型 写入数组

//本文在 QT6.2.4 MSVC2019调试成功。 //sqlite数据库的BLOB类型常常用来存数组&#xff0c;不同类型和长度的数组&#xff0c;需要转化为一个个字节。 //哪些数组呢&#xff0c;整型、浮点型、字符串都可以。图像的raw数据也是数组。 //那么QByteArray 正好可以。 //QByte…

HarmonyOS NEXT 使用Canvas实现模拟时钟案例

介绍 本示例介绍利用 Canvas 和定时器实现模拟时钟场景&#xff0c;该案例多用于用户需要显示自定义模拟时钟的场景。 效果图预览 使用说明 无需任何操作&#xff0c;进入本案例页面后&#xff0c;所见即模拟时钟的展示。 使用说明 无需任何操作&#xff0c;进入本案例页…

微服务之SpringCloud AlibabaNacos服务注册和配置中心

一、概述 1.1注册中心原理 在微服务远程调用的过程中&#xff0c;包括两个角色&#xff1a; 服务提供者&#xff1a;提供接口供其它微服务访问&#xff0c;比如item-service 服务消费者&#xff1a;调用其它微服务提供的接口&#xff0c;比如cart-service 在大型微服务项目…

【C++】类型转换

文章目录 一、种类1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast 二、RTTI 一、种类 1. static_cast static_cast用于相近类型的转换, 比如double, int, char… 不能用于不相关的类型转换. 类似于C语言中的隐式类型转换, 但是static_cast增强了可视性: i…

每日算法4/21

LCR 073. 爱吃香蕉的狒狒 题目 狒狒喜欢吃香蕉。这里有 N 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 H 小时后回来。 狒狒可以决定她吃香蕉的速度 K &#xff08;单位&#xff1a;根/小时&#xff09;。每个小时&#xff0c;她将会选…

http和https区别与上网过程

1.概念 HTTP和HTTPS是两种常用于Web浏览器和网站服务器之间信息传递的协议。HTTP在传输数据时使用的是明文&#xff0c;而HTTPS则是在HTTP的基础上增加了SSL/TLS加密层&#xff0c;提供了数据的加密传输。 HTTP&#xff08;超文本传输协议&#xff09;&#xff1a;是一个基于…

idea设置了maven会自动变回C盘那个

idea设置了maven会自动变回C盘那个 IDE支持Maven包装器&#xff0c;IDEA会将其用于项目&#xff0c;如果不想从包装器中使用Maven。 需要将项目中.mvn/wrapper/下的maven-wrapper.properties从项目中删除。

nacos 2022.0.0.0 版本实现负载均衡及集群

一、loadbalancer实现负载均衡 新版本的nacos已经取消了对ribbon的支持&#xff0c;所以不能使用ribbon来实现nacos提供的负载均衡。 但是新版本中我们可以使用loadbalancer实现负载均衡。 二、导入loadbalancer坐标 1、原本的坐标&#xff1a; 在parent的pom.xml中 <p…