当前位置:   article > 正文

Elasticsearch常用查询语法及RestClient操作_elasticsearch 查询所有字段

elasticsearch 查询所有字段

DSL Query基本语法

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

  1. #查询所有数据
  2. GET /索引名/_search
  3. {
  4. "query": {
  5. "查询类型": {
  6. "查询条件":"条件值"
  7. }
  8. }
  9. }

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

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

  1. #根据条件查询 match
  2. GET /索引名/_search
  3. {
  4. "query": {
  5. "查询类型": {
  6. "查询那个字段": "查询的具体值"
  7. }
  8. }
  9. }
  10. # 示例
  11. GET /hotel/_search
  12. {
  13. "query": {
  14. "match": {
  15. "all": "北京"
  16. }
  17. }
  18. }

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

  1. # 根据多个字段来搜 multi_match
  2. GET /索引名/_search
  3. {
  4. "query": {
  5. "查询类型": {
  6. "query": "需要查询字段的具体值",
  7. "fields": ["查询字段1","查询字段2"]
  8. }
  9. }
  10. }
  11. # 根据多个字段来搜 multi_match
  12. GET /hotel/_search
  13. {
  14. "query": {
  15. "multi_match": {
  16. "query": "北京",
  17. "fields": ["city","name"]
  18. }
  19. }
  20. }

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

3,精准查询

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

term:根据词条精准查询

range:根据值的范围查询

term查询

  1. #精准查询-term
  2. GET /索引名/_search
  3. {
  4. "query": {
  5. "查询类型": {
  6. "查询字段": {
  7. "value": "查询的具体值"
  8. }
  9. }
  10. }
  11. }
  12. #精准查询-term
  13. GET /hotel/_search
  14. {
  15. "query": {
  16. "term": {
  17. "city": {
  18. "value": "上海"
  19. }
  20. }
  21. }
  22. }

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

range查询-范围查询

  1. #精准查询-范围查询range
  2. GET /索引名/_search
  3. {
  4. "query": {
  5. "查询类型": {
  6. "查询字段": {
  7. "gte": 最小值,
  8. "lte": 最大值
  9. }
  10. }
  11. }
  12. }
  13. GET /hotel/_search
  14. {
  15. "query": {
  16. "range": {
  17. "score": {
  18. "gte": 10,
  19. "lte": 45
  20. }
  21. }
  22. }
  23. }

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

4,复合查询

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

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

1,funcation score Query

例如:

  1. #修改得分
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "function_score": {
  6. "query": {
  7. "match": {
  8. "all": "北京"
  9. }
  10. },
  11. "functions": [
  12. {
  13. "filter": {
  14. "term": {
  15. "brand": "如家"
  16. }
  17. },
  18. "weight": 10
  19. }
  20. ],
  21. "boost_mode": "multiply"
  22. }
  23. }
  24. }

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

2,Boolean Query

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

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

  1. # 使用bool查询功能
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "bool": {
  6. "must": [
  7. {
  8. "match": {
  9. "name": "如家"
  10. }
  11. }
  12. ],
  13. "must_not": [
  14. {
  15. "range": {
  16. "range": {
  17. "gt": 400
  18. }
  19. }
  20. }
  21. ]
  22. }
  23. }
  24. }

使用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:

  1. /**
  2. *用来解析返回的数据,包含高亮处理(针对的是name字段)
  3. * @param searchResponse 发送请求之后的响应
  4. */
  5. void parseData( SearchResponse searchResponse){
  6. //解析拿到的数据
  7. //有用的数据都在这个对象里面
  8. SearchHits hits = searchResponse.getHits();
  9. //获取数据总数
  10. long total = hits.getTotalHits().value;
  11. System.out.println("数据总数:"+total);
  12. //这个数组里面存放的是每一条数据
  13. SearchHit[] searchHits = hits.getHits();
  14. for (SearchHit documentFields : searchHits) {
  15. String sourceJson = documentFields.getSourceAsString();
  16. HotelDoc hotelDoc = JSON.parseObject(sourceJson, HotelDoc.class);
  17. //进行高亮的结果解析
  18. Map<String, HighlightField> highlightFieldMap = documentFields.getHighlightFields();
  19. if(!CollectionUtils.isEmpty(highlightFieldMap)){
  20. HighlightField highlightField = highlightFieldMap.get("name");
  21. if(highlightField!=null){
  22. //获取高亮处理后的name
  23. String name = highlightField.fragments()[0].string();
  24. hotelDoc.setName(name);
  25. }
  26. }
  27. System.out.println(hotelDoc);
  28. }
  29. }

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

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

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

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

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

  1. /**
  2. * multiMatch查询,可以指定多个字段
  3. * @throws IOException
  4. */
  5. @Test
  6. void multiMatchTest() throws IOException {
  7. SearchRequest request =new SearchRequest("hotel");
  8. //指定查询字段的值是多少,并指定那个字段,可以有多个,我们这里指定name,和city
  9. request.source().query(QueryBuilders.multiMatchQuery("北京","name","city"));
  10. SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  11. parseData(searchResponse);
  12. }

精准查询

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

term查询

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

range查询

  1. /**
  2. * range查询-根据条件范围插寻
  3. * @throws IOException
  4. */
  5. @Test
  6. void rangTest() throws IOException {
  7. SearchRequest request =new SearchRequest("hotel");
  8. //指定词条进行范围插寻,查找评分从2040 的酒店
  9. request.source().query(QueryBuilders.rangeQuery("score").gt(20).lt(40));
  10. SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  11. parseData(searchResponse);
  12. }

对查询结果做排序分页

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

对查询结果做高亮处理

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/964393
推荐阅读
相关标签
  

闽ICP备14008679号