elasticsearch 跨索引联合多条件查询

这篇具有很好参考价值的文章主要介绍了elasticsearch 跨索引联合多条件查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Elasticsearch

Elasticsearch 是一个免费且开放的分布式搜索和分析引擎。适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。

Elasticsearch 用来收集大量日志和检索文本是个不错的选择,可以在承载了 PB 级数据的成百上千台服务器上运行。

关键字:

  • 实时
  • 分布式
  • 搜索
  • 分析

需求

如果既要对一些字段进行分词查询,同时要对另一些字段进行精确查询,就需要使用布尔查询来实现了。同时索引是按照一定规则建立的,例如按照时间段,此时查询的时候会涉及到联合索引查询。布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来,有三个可选的参数:

must: 文档必须匹配must所包括的查询条件,相当于 “AND”

should: 文档应该匹配should所包括的查询条件其中的一个或多个,相当于 “OR”

must_not: 文档不能匹配must_not所包括的该查询条件,相当于“NOT”

使用版本

elasticsearch:7.1.1
spring-boot-starter-data-elasticsearch:2.5.4

联合索引多条件查询示例

@Autowired
private RestHighLevelClient client;

ObjectMapper mapper = new ObjectMapper();

@Override
public Page<Book> search(Pageable pageable, Set<String> indexNameList) {
    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    //must中的条件,必须全部匹配。需要将字段的type设置为keyword 或者 指定字段时用 `字段.keyword`(实际测试并不生效,可能还和analyzer有关)
    queryBuilder.must(QueryBuilders.termQuery("title", "杨"));
    //匹配should中的条件(匹配1个或多个,根据需求配置)
    queryBuilder.should(QueryBuilders.termQuery("address", "山西"));
    //matchPhraseQuery 通配符搜索查询,支持 * 和 ?, ?匹配任意单个字符,这么查询可能慢
    queryBuilder.must(QueryBuilders.matchPhraseQuery("remark", "*" + "你好" + "*"));
    //必须匹配的 should条件数量
    queryBuilder.minimumShouldMatch(1);

    //数据集合
    List<Book> hits = new ArrayList<>();
    //总数
    long total = 0L;
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
        .query(queryBuilder)
        .from(pageable.getPageNumber())
        .size(pageable.getPageSize());
    //es中存在的索引
    List<String> arrayList = getExistIndex(indexNameList);

    SearchRequest searchRequest = new SearchRequest(indexArray).source(searchSourceBuilder);
    try {
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        // 搜索结果
        org.elasticsearch.search.SearchHits searchHits = searchResponse.getHits();
        // 匹配到的总记录数
        total = searchHits.getTotalHits().value;
        org.elasticsearch.search.SearchHit[] searchHitsHits = searchHits.getHits();
        for (SearchHit searchHitsHit : searchHitsHits) {
            //如果es中字段比定义的实体类中多,反序列化会提示异常,需要加以下注解
            //忽略无法识别的属性:@JsonIgnoreProperties(ignoreUnknown = true)
            Book book = mapper.readValue(searchHitsHit.getSourceRef().utf8ToString(), Book.class);
            hits.add(book);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
//检测每个索引是否存在,只返回存在的索引
private List<String> getExistIndex(Set<String> indexNameList) {
    List<String> existsIndex = new ArrayList<>();
    for (String indexName : indexNameList) {
        try {
            GetIndexRequest existsRequest = new GetIndexRequest();
            existsRequest.indices(indexName);
            boolean exists = client.indices().exists(existsRequest, RequestOptions.DEFAULT);
            //返回索引集合中存在的索引,避免传入不存在的索引,导致查询异常
            if (exists) {
                existsIndex.add(indexName);
            }
        } catch (Exception e) {
        }
    }
    return existsIndex;
}

相关API

//查看索引结构
GET : http://127.0.0.1:9200/索引/_mapping

相关资料

https://blog.csdn.net/u011821334/article/details/100979286
https://www.cnblogs.com/coderxz/p/13268417.html
https://www.cnblogs.com/keatsCoder/p/11341835.html
https://blog.csdn.net/weixin_43847283/article/details/123616890
https://blog.csdn.net/weixin_43847283/article/details/123933244文章来源地址https://www.toymoban.com/news/detail-406181.html

到了这里,关于elasticsearch 跨索引联合多条件查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Elasticsearch 基本使用(三)条件查询

    term 单词查询 对于不分词的字段( 数组 视同普通字段,查询数组字段时,只要匹配上一项就算匹配) 条件直接匹配字段值 对于分词的字段;在字段 倒排索引表,仅限分词结果 内查找条件值 terms 同样是单词查询;但条件值可以是多个值,效果为 term1 or term2 should : [ {term1…

    2024年02月11日
    浏览(32)
  • ElasticSearch基础篇-条件查询与映射

    条件查询 q:代表查询条件 响应结果 🔖 由于在域名后面添加查询条件不是很方便,所以我们一般使用json格式发送查询条件 匹配查询 query:代表查询条件 match:匹配查询 全量查询 match_all:匹配所有 分页查询 from:起始位置 (页码-1)*每页数据条数 size: 分页大小 字段过滤 _source:设置

    2024年02月14日
    浏览(35)
  • Java Elasticsearch多条件分组聚合查询

    需求         在项目开发中,需要从elasticsearch中查询日志数据,先统计每一天的日志调用量,然后在每一天的分组聚合基础上,再分组聚合统计成功和失败的日志调用量。 代码

    2024年02月08日
    浏览(42)
  • 初识ElasticSearch(5) -批量操作之bulk | 条件查询 | 其它查询

    本系列笔记结合HTTP请求(使用postman调用,源文件见GitHub)和ElasticsearchRestTemplate进行调用学习 ElasticsearchRestTemplate封装了RestHighLevelClient,有些场景还得用RestHighLevelClient来操作 版本说明:使用的SpringBoot-2.3.5,对应的ElasticSearch-7.6.2;所以还是可以用RestHighLevelClient ElasticSearch-7

    2023年04月08日
    浏览(59)
  • springboot整合elasticsearch8组合条件查询

    整合过程见上一篇文章 springboot整合elasticsearch8 1.es8多条件组合查询 2.使用scroll进行大数据量查询

    2024年02月16日
    浏览(40)
  • elasticsearch相同查询条件每次返回结果不一样

    现象: 今天web开发人员反馈,在腾讯云对某一个客户的某表数据执行相同的查询结果,有时候不返回数据; 我们是按周区分索引的,数据量不大,去掉时间条件执行查询发现会交替出现  命中21980和命中的8999结果; 解决: 1.首先简单查询其他的表或者其他的集群有没有类似

    2024年01月23日
    浏览(45)
  • SpringBoot中进行elasticSearch查询,使用QueryBuilders构建各类条件查询

    BoolQueryBuilder对象使用must方法build,多个and使用多个must BoolQueryBuilder对象使用should方法build,多个or使用多个should使用 本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。 首发链接:https://www.cnblogs.com/lingyejun/p/17557467.html

    2024年02月16日
    浏览(24)
  • ElasticSearch第十四讲 ES有条件复杂查询

    模糊匹配 模糊匹配主要是针对文本类型的字段,文本类型的字段会对内容进行分词,对查询时,也会对搜索条件进行分词,然后通过倒排索引查找到匹配的数据,模糊匹配主要通过match等参数来实现 match : 通过match模糊匹配条件内容 prefix : 前缀匹配 regexp : 通过正则表达

    2024年02月03日
    浏览(37)
  • ElasticSearch系列 - SpringBoot整合ES:组合多个查询条件 bool 查询

    01. ElasticSearch 布尔查询是什么? 在实际应用中,我们很有可能会查询多个值或字段。 一个 bool 查询由三部分组成: must:所有的语句都必须(must) 匹配,与 AND 等价。 must_not:所有的语句都不能(must not)匹配,与 NOT 等价。 should:至少有一个语句要匹配,与 OR 等价。 02.

    2023年04月08日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包