JAVA操作ES中的BoolQueryBuilder 查询方法

一,创建es的连接
public TransportClient transportClient(){
    Settings settings = Settings.builder()
            .put("cluster.name", "elasticsearch")
            .build();
    TransportClient client  = new PreBuiltTransportClient(settings);
    TransportAddress transportAddress = null;
    try {
        transportAddress = new TransportAddress(InetAddress.getByName(host), Integer.valueOf(port));
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
    client.addTransportAddress(transportAddress);
    return client;
}
 

二,java es api的添加操作

transportClient.prepareIndex("search_index", "doc").setSource(json, XContentType.JSON).get();

三,java es api的修改操作

transportClient.prepareUpdate("search_index", "doc","gug4u3EBSHOgAqyn-5aI").setSource(json, XContentType.JSON).get();

四,java es api的删除操作

transportClient.prepareDelete("search_index", "doc", "gug4u3EBSHOgAqyn-5aI").get();
 

五,查询QueryBuilders

BoolQueryBuilder queryBuilder= QueryBuilders.boolQuery();
1,matchAllQuery匹配所有

queryBuilder.matchAllQuery();
2,termQuery精准匹配,大小写敏感且不支持

queryBuilder.termQuery("key", value) 一次匹配一个值,完全匹配
queryBuilder.termsQuery("key", obj1, obj2..)   一次匹配多个值
3,matchPhraseQuery对中文精确匹配

queryBuilder.matchPhraseQuery("key", value)

4,matchQuery("key", Obj) 单个匹配, field不支持通配符, 前缀具高级特性

queryBuilder.matchQuery(key, value);
5,multiMatchQuery("text", "field1", "field2"..); 匹配多个字段, field有通配符忒行

queryBuilder.multiMatchQuery(value, key1, key2, key3);
6,组合查询

   * must:   AND
   * mustNot: NOT
   * should:: OR
 queryBuilder.must(QueryBuilders.termQuery("user", "kimchy"))
            .mustNot(QueryBuilders.termQuery("message", "nihao"))
            .should(QueryBuilders.termQuery("gender", "male"));

7.should和must

should查询在mysql中就好比是or或,但在es中使用should查询必须要和must一起使用才可以,相当于must[should A,should B],中文解释就好比是满足A或者是B条件的数据,如下这一段shoudl语句的大概意思是满足是用户A上传并且permission状态是private或者permission状态是public的
 

public void should(){
    // 最外层bool
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    // 使用should的bool
    BoolQueryBuilder shouldBuilder= QueryBuilders.boolQuery();

    BoolQueryBuilder must = QueryBuilders.boolQuery().must(QueryBuilders.termQuery(DocumentFieldEnum.upload_user_name.name(), "用户A"))               .must(QueryBuilders.termQuery(DocumentFieldEnum.permission.name(), PermissionEnum.PRIVATE.getKey()));

    shouldBuilder.should(must);
    shouldBuilder.should(QueryBuilders.termQuery(DocumentFieldEnum.permission.name(), PermissionEnum.PUBLIC.getKey()));
boolQueryBuilder.must(shouldBuilder);
}
 

  • 11
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: boolquerybuilder.filter是Elasticsearch的一个查询构建器,用于构建过滤查询。过滤查询是一种不会影响查询结果排序的查询方式,它可以根据指定的条件过滤掉不符合条件的文档,只返回符合条件的文档。boolquerybuilder.filter可以用于构建多个过滤条件的组合查询,支持多种过滤条件类型,如term、range、exists等。使用boolquerybuilder.filter可以提高查询效率,减少不必要的计算和网络传输。 ### 回答2: boolquerybuilder.filter用法 boolquerybuilderElasticsearchQueryBuilder之一,在查询起到非常重要的作用。其,filter是boolquerybuilder的一个子查询器,用来加快查询速度和优化查询性能。 boolquerybuilder.filter使用过程,我们需要先明确需求,选择合适的过滤条件。其具体使用步骤为: 1、创建boolquerybuilder对象 2、使用must()、should()或mustNot()等方法指定查询条件 3、使用filter()方法添加过滤条件 4、通过setQuery()方法完成查询。 在filter()方法,传入的参数包含一个或多个查询条件。查询条件有多种类型,可以是term查询、range查询、match_all查询、exists查询等。我们在添加查询条件时,需根据实际问题,选择合适的查询方式,以提高查询效率。当使用filter方法时,查询结果不会被计算得分指标,因此,查询速度比较快。具体使用如下: ```java BoolQueryBuilder builder = QueryBuilders.boolQuery(); builder.must(QueryBuilders.matchQuery("name", "john")); // 查询必须满足“name”字段包含“john”这个条件 builder.filter(QueryBuilders.termQuery("status", "published")); // 将“status”字段为“published”的文档,过滤出来 builder.filter(QueryBuilders.rangeQuery("age").gte(30)); // 将“age”字段大于等于 30 的文档,过滤出来 builder.filter(QueryBuilders.existsQuery("gender")); // 将“gender”字段有值的文档,过滤出来 SearchResponse response = client.prepareSearch("index1", "index2") .setTypes("type") .setQuery(builder)// 将查询条件塞入Query .setFrom(0).setSize(5).setExplain(true) .get(); ``` 在上述例子,查询将对多个索引进行,而查询语句filter()方法在查询时对“name”字段、”status“字段、“age”字段和“gender”字段分别做了限定。同时,我们可以通过分页、结果排序等方式对查询结果做进一步的处理。 在实际的使用,我们还可以将多个filter()方法整合在一起,用boolQueryBuilder查询一次,从而获取满足多个条件的文档。具体的使用可参考elasticsearch官方文档。 ### 回答3: boolquerybuilder.filter 是 Elasticsearch 查询 DSL 的一种语法,用于过滤 Elasticsearch 的文档。它通过组合一个或多个查询条件来实现文档的过滤,返回满足过滤条件的文档。具体使用方法如下: 1. 创建一个 boolquerybuilder 对象,通过 boolquerybuilder.filter() 方法添加过滤条件。过滤条件可以是以下任何一种类型的查询语句: - MatchAllQueryBuilder:匹配所有文档。 - TermQueryBuilder:通过精确匹配字段值来过滤文档。 - RangeQueryBuilder:通过指定字段值的大小范围来过滤文档。 - BoolQueryBuilder:通过组合多个查询条件来过滤文档,支持 AND 、OR 和 NOT 逻辑操作。 2. 将 boolquerybuilder 对象放入 SearchSourceBuilder 对象query() 方法,发起查询请求。 例如,以下代码片段演示了如何使用 boolquerybuilder.filter 过滤文档: ``` // 创建 boolquerybuilder 对象,将多个过滤条件组合在一起 BoolQueryBuilder filterBuilder = QueryBuilders.boolQuery() .filter(QueryBuilders.termQuery("gender", "male")) .filter(QueryBuilders.rangeQuery("age").lte(30)); // 将 boolquerybuilder 对象放入 SearchSourceBuilder 对象进行查询 SearchResponse response = client.prepareSearch("index_name") .setTypes("doc_type") .setQuery(QueryBuilders.matchAllQuery()) .setPostFilter(filterBuilder) .get(); ``` 以上代码会查询名为 "index_name" 的索引下所有文档,并将过滤条件限制为性别为男性且年龄小于等于 30 岁的文档。查询结果将只包含满足过滤条件的文档。 boolquerybuilder.filter 对 Elasticsearch 的文档进行过滤,常用于数据分析、搜索引擎等场景。同时,也支持将多个过滤条件组合在一起,提高查询效率和准确性,是 Elasticsearch 支持丰富的查询语句之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值