ES查询多个索引,但是某些索引的name不同

本文介绍了一种针对多个不同字段的索引进行复杂筛选的方法。通过使用布尔查询和条件组合,实现对特定数据类型的精准匹配,特别是针对社交媒体平台数据的高效检索方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考: https://blog.youkuaiyun.com/qq_37147750/article/details/111319151

背景:
目前有四个索引index, 对于这四个index他们的字段并不完全相同,要支持筛选。
目前的问题是,其中有两个索引要先根据条件筛选一遍。后续的筛选根据这次的结果做基础。
但是这两个索引的筛选条件也不一样。
相当于 SQL:  (select * from A where a_id in (x1,x2,x3,x4)) union all (select * from B where b_id in (y1,x2,x3,x4)) union all 索引三  union all  索引四

在这个基础上做筛选

 public QueryBuilder addIndexCondition(String indexName, String field, List<String> terms){
	    QueryBuilder firstQuery = new BoolQueryBuilder()
                .must(QueryBuilders.termQuery("_index", indexName))
                .must(QueryBuilders.termsQuery(field, terms));
	    return firstQuery;
  }
  
  public QueryBuilder addIndexNoCondition(String indexName){
	    QueryBuilder firstQuery = new BoolQueryBuilder()
              .must(QueryBuilders.termQuery("_index", indexName));
	    return firstQuery;
}
if (StringUtils.isNotBlank(data_type) && (data_type.contains("1") && data_type.contains("2"))) {
            	
            	QueryBuilder youtubeQuery = sc.addIndexNoCondition("youtube_info");
            	QueryBuilder instagramQuery = sc.addIndexNoCondition("instagram_info");

            	
				QueryBuilder firstQuery = null;
				if(fbList.size() >0){
					firstQuery = sc.addIndexCondition("facebook_info", "fu_id", fbList);
				}
			
				QueryBuilder secondQuery = null;
				if(twList.size() >0){
					secondQuery = sc.addIndexCondition("twitter_info", "uid", twList);
				}
				
				if(firstQuery != null && secondQuery != null){
					QueryBuilder mainQuery = new BoolQueryBuilder().should(firstQuery).should(secondQuery).should(youtubeQuery).should(instagramQuery);
					sc.addQuery(mainQuery, ISIOperator.MUST);
					
				}else if(firstQuery != null && secondQuery == null){
					QueryBuilder mainQuery = new BoolQueryBuilder().should(firstQuery);
					sc.addQuery(mainQuery, ISIOperator.MUST);
				}else if(firstQuery == null && secondQuery != null){
					QueryBuilder mainQuery = new BoolQueryBuilder().should(secondQuery);
					sc.addQuery(mainQuery, ISIOperator.MUST);
				}
				
    			
            } else if ("1".equals(data_type)) {
            	if(twList.size() >0){
            		sc.addPrimitiveTermQuery("uid", twList, ISIOperator.MUST);//twitter
            	}
           
            } else if ("2".equals(data_type)) {
            	if(fbList.size() >0){
              		 sc.addPrimitiveTermQuery("fu_id", fbList, ISIOperator.MUST);//facebook
            	}
            }

DSL:

[twitter_info, facebook_info, youtube_info, instagram_info]


{
  "from" : 0,
  "size" : 15,
  "query" : {
    "bool" : {
      "must" : [
        {
          "bool" : {
            "should" : [
              {
                "bool" : {
                  "must" : [
                    {
                      "term" : {
                        "_index" : {
                          "value" : "facebook_info",
                          "boost" : 1.0
                        }
                      }
                    },
                    {
                      "terms" : {
                        "fu_id" : [
                         
                          
                          "1118",
                          "1119",
                          "1120"
                        ],
                        "boost" : 1.0
                      }
                    }
                  ],
                  "disable_coord" : false,
                  "adjust_pure_negative" : true,
                  "boost" : 1.0
                }
              },
              {
                "bool" : {
                  "must" : [
                    {
                      "term" : {
                        "_index" : {
                          "value" : "twitter_info",
                          "boost" : 1.0
                        }
                      }
                    },
                    {
                      "terms" : {
                        "uid" : [
                         
                          "990",
                          "991",
                          "1036"
                        ],
                        "boost" : 1.0
                      }
                    }
                  ],
                  "disable_coord" : false,
                  "adjust_pure_negative" : true,
                  "boost" : 1.0
                }
              },
              {
                "bool" : {
                  "must" : [
                    {
                      "term" : {
                        "_index" : {
                          "value" : "youtube_info",
                          "boost" : 1.0
                        }
                      }
                    }
                  ],
                  "disable_coord" : false,
                  "adjust_pure_negative" : true,
                  "boost" : 1.0
                }
              },
              {
                "bool" : {
                  "must" : [
                    {
                      "term" : {
                        "_index" : {
                          "value" : "instagram_info",
                          "boost" : 1.0
                        }
                      }
                    }
                  ],
                  "disable_coord" : false,
                  "adjust_pure_negative" : true,
                  "boost" : 1.0
                }
              }
            ],
            "disable_coord" : false,
            "adjust_pure_negative" : true,
            "boost" : 1.0
          }
        }
      ],
      "disable_coord" : false,
      "adjust_pure_negative" : true,
      "boost" : 1.0
    }
  },
  "stored_fields" : "auto_id",
  "sort" : [
    {
      "pubtime" : {
        "order" : "desc"
      }
    }
  ]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值