Elasticsearch常用查询语法及RestClient操作

这篇具有很好参考价值的文章主要介绍了Elasticsearch常用查询语法及RestClient操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DSL Query基本语法

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

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

Elasticsearch常用查询语法及RestClient操作,elasticsearch,大数据,搜索引擎

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

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

#根据条件查询 match

GET /索引名/_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

Elasticsearch常用查询语法及RestClient操作,elasticsearch,大数据,搜索引擎

例如:

#修改得分
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){
                    //获取高亮处理后的name
                    String name = highlightField.fragments()[0].string();
                    hotelDoc.setName(name);
                }
                
            }
            System.out.println(hotelDoc);
        }
    }

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

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

精准查询

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

term查询


    /**
     * term查询-根据词条精准查询
     * @throws IOException
     */
    @Test
    void 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
     */
    @Test
    void 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
     */
    @Test
    void 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
     */
    @Test
    void 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] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html文章来源地址https://www.toymoban.com/news/detail-858009.html

到了这里,关于Elasticsearch常用查询语法及RestClient操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES查询常用语法

    目录 1. ElasticSearch之查询返回结果各字段含义 2. match 查询 3. term查询 4. terms 查询 5. range 范围 6. 布尔查询 6.1 filter加快查询效率的原因 7. boosting query(提高查询) 8. dis_max(最佳匹配查询) 9. 分页 10. 聚合查询【内含实际的demo】 执行命令:索引库名称/_search 空搜索的结果为: 按照

    2023年04月09日
    浏览(51)
  • solr快速上手:常用查询语法(八)

    solr作为搜索引擎,就像我们使用mysql一样,在日常业务中,更多接触的则是各类操作语法,所以今天,我们再来学习solr的常用查询语法,为大家在工作中最基本的solr查询打下基础。 solr快速上手:solr简介及安装(一) solr快速上手:核心概念及solr-admin界面介绍(二) solr快速

    2024年02月09日
    浏览(53)
  • Springboot 整合ElasticSearch 常用的插入查询,模糊查询,范围查询

    repository.deleteById(id); } catch (Exception ex) { ex.printStackTrace(); return false; } return true; } public Dog saveDog(Dog dog) { try { Dog save = repository.save(dog); System.out.println(“结果:”+save.toString()); return save; } catch (Exception ex) { ex.printStackTrace(); return null; } } public Boolean saveDogAll(List dogsList) { try { reposit

    2024年04月22日
    浏览(43)
  • 【ElasticSearch】ElasticSearch常用查询api集合(一)

    本文为es常见DSL搜索入门帖子 开始之前先贴个对应关系,方便各位理解 在es7+的版本中,是没有类型的概念的,所以,添加数据直接在索引中添加; ⭐请求es地址均为 localhost:9200/{索引}/_search ,为了编写方便些,在下面的例子中会直接写请求体; bool : 用来组合多个条件

    2024年02月11日
    浏览(42)
  • 常用的Elasticsearch查询DSL

    1.基本查询 2.多条件查询 3.范围查询 4.复杂查询 5.聚合查询

    2024年02月12日
    浏览(50)
  • ElasticSearch常用查询命令查看基本信息

    查看es的集群状态 http://IP:9200/_cat/healthv 注: IP指es集群某个ip地址, v表示格式化输出 查看es集群节点列表 http://IP:9200/_cat/nodesv 查看es集群所有索引及数据大小 http://IP:9200/_cat/indicesv 查看单个索引结构信息 http://IP:9200/indexNamepretty=true 注: indexName是索引名字, pretty=true表示格式化输出

    2024年02月03日
    浏览(38)
  • 【微服务】Elasticsearch常用查询&结果处理(三)

    🚗Es学习·第三站~ 🚩Es学习起始站:【微服务】Elasticsearch概述环境搭建(一) 🚩本文已收录至专栏:微服务探索之旅 👍希望您能有所收获 在上一站的学习中,我们已经导入了大量数据到es中,实现了数据存储功能。接下来如需看自己实操效果请根据上一站的 三.环境搭建 部

    2024年02月04日
    浏览(40)
  • RestClient操作文档和DSL查询语法

    注:一般不用上方地理查询,用下面方法! 算法了解 4.1、Function Score Query(修改相关性算分) 4.2、Boolean Query

    2024年02月16日
    浏览(45)
  • Elasticsearch 常用的增加、删除、修改、查询语句

    新增 删除 修改 批量增删改 查询 查询指定索引下全部数据 查询指定索引下指定id的数据 查询指定索引下全部数据 查询指定值(match) 在多个字段中查询指定值(multi_match) match、multi_match是模糊匹配,匹配时会对所查找的进行分词,然后按分词匹配查找。 term 查询

    2024年02月03日
    浏览(42)
  • MySQL 查询常用操作(2) —— 条件查询 where

    MySQL中常用的查询操作,首先是能直接从表中直接取出数据,接着能对查询结果做一些简单的处理,比如去重等,然后是根据条件查询数据,包括精准查询、模糊查询以及按照数据的某个范围或者指定多个指标进行查询,值得注意的是,MySQL中的一些查询会忽略空值。最后是将

    2023年04月10日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包