ElasticSearch(十二) Bool Query JAVA API

Bool Query 用于组合多个叶子或复合查询子句的默认查询

must 相当于 与 & =

must not 相当于 非 ~   !=

should 相当于 或  |   or 

filter  过滤

boolQuery()
        .must(termQuery("content", "test1"))               
        .must(termQuery("content", "test4"))                 
        .mustNot(termQuery("content", "test2"))              
        .should(termQuery("content", "test3"))               
        .filter(termQuery("content", "test5"));

private SearchRequest getSearchRequest(RequestType request) {

SearchRequest sr = new SearchRequest();

//指定索引名称,如未指定则会查询所有
sr.indices(ElasticSearchConst.XXX_INDEX);
sr.types(ElasticSearchConst.XXX_TYPE);

SearchSourceBuilder source = new SearchSourceBuilder();
BoolQueryBuilder bq = QueryBuilders.boolQuery();

getQueryBuilder(request, bq);

// from 从0开始,包含前后边界 实际是  <=  >=

source.from(request.getRowStart());
source.size(request.getRowSize());
source.query(bq);

setSort(request, source);
sr.source(source);
return sr;
}


private void getQueryBuilder(RequestType request, BoolQueryBuilder bq) {

getOrderQueryBuilder(request, bq);

addPurchaseOrderQueryBuilder(request, bq);
}

/**
* 查询条件
*
* @param request
* @param bq
*/
private void getOrderQueryBuilder(RequestType request, BoolQueryBuilder bq) {

        // termQuery 精确匹配,不分词 相当于 等于 =

       //Type.childType 多层类型嵌套,具体索引结构,参考mapping   

      //  GET  yourindexname/_mapping

     Mapping:

{
  "yourindexname": {
    "mappings": {
      "type1": {
        "properties": {
          "childtype": {
            "properties": {
              "cedStatus": {
                "type": "text",
                "fields": {
                "keyword": {
                "type": "keyword",
                "ignore_above": 256
                      }
                    }
                },

  bq.must(QueryBuilders.termQuery("Type.childType", request.getOrderId()));
        //rangeQuery 范围查询,最大范围不超过1w

  bq.must(QueryBuilders.rangeQuery("Type.childType.departureDate")
    .gte(DateUtil.toSqlTimeStamp(request.getDepartureDateStart().getTime()).getTime())
    .lte(DateUtil.toSqlTimeStamp(request.getDepartureDateEnd().getTime()).getTime()));

//QueryBuilders.matchPhraseQuery  匹配查询,不分词,相当于 contains

//matchPhraseQuery 是直接以一个短语的形式查询,顺序无差,且连接在一起

pobq.must(QueryBuilders.matchPhraseQuery(
  String.format("%s%s%s", preFix, i, ".vacationVBKPurchaseOrderBaseInfoDto.contactName"),
  request.getContactName()));

原文地址:https://www.cnblogs.com/xiaocandou/p/8127371.html

时间: 2024-10-14 11:25:28

ElasticSearch(十二) Bool Query JAVA API的相关文章

全栈JavaScript之路(十二)了解 Selector API

2008 年之前,浏览器中几乎所有的DOM扩展都是专有的.此后,W3C 着手将一些已经成为事实标准的专有扩展标准化并写入规范当中. Selector API  level 1  的核心是两个方法: querySelector(), querySelectorAll() .在兼容浏览器中可以通过Docuemnt 类型节点,或者Element类型节点调用. 目前已完全支持Selectors API Level 1的浏览器有IE 8+.Firefox 3.5+.Safari 3.1+.Chrome 和

Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建

[TOC] Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建 Redis Java API使用(一):单机版本Redis API使用 Redis的Java API通过Jedis来进行操作,因此首先需要Jedis的第三方库,因为使用的是Maven工程,所以先给出Jedis的依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactI

Java多线程和并发(十二),Java线程池

目录 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 6.线程池的状态 7.线程池大小如何选定 十二.Java线程池 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 虽然Executor提供的五种方法够用了,但是仍然不能满足

Elasticsearch 5.4.3实战--Java API调用:搜索建议

通常的搜索引擎,都会根据用户的输入,实时给予匹配的提示. 那么这个功能在elasticsearch中如何实现呢? Elasticsearch里设计了4种类别的Suggester,分别是: Term Suggester Phrase Suggester Completion Suggester Context Suggester 我是采用Completion Suggester来实现的. 原理的文章网上有很多,这里不多说.我们直接上代码: 1 package com.cs99lzzs.elasti

Elasticsearch 5.4.3实战--Java API调用:搜索

ES有多种查询方式,我自己的业务是需要对多个字段进行查询,具体实现类代码如下. 1 package com.cs99lzzs.elasticsearch.service.imp; 2 3 import java.text.DecimalFormat; 4 import java.util.ArrayList; 5 import java.util.Iterator; 6 import java.util.List; 7 import java.util.Map; 8 9 import javax

Spark2.2+ES6.4.2(三十二):ES API之ndex的create(创建index时设置setting,并创建index后根据avro模板动态设置index的mapping)/update/delete/open/close

要想通过ES API对es的操作,必须获取到TransportClient对象,让后根据TransportClient获取到IndicesAdminClient对象后,方可以根据IndicesAdminClient对象提供的方法对ES的index进行操作:create index,update index(update index settings,update index mapping),delete index,open index,close index. 准备工作(创建Transpor

HBase 二次开发 java api和demo

1. 试用thrift python/java以及hbase client api,结论如下: 1.1 thrift的安装和发布繁琐,可能会遇到未知的错误,且hbase.thrift的版本在变化中.优点代码简单,需要打包的内容少. 1.2 hbase client api,需要的jar很多,发布版的容量也很大,打包后近百兆.优点是,明确,无歧义. 2. 推荐用hbase client api的方式搞定. 3. 以下均为技术细节. 4. 有一台机器/一个集群,在运行hadoop,也运行了基于这个h

hadoop学习记录(二)HDFS java api

FSDateinputStream 对象 FileSystem对象中的open()方法返回的是FSDateInputStream对象,改类继承了java.io.DateInoutStream接口.支持随机访问 Seekable接口 支持在文件中找到指定位置,并提供一个查询当前位置相对于文件起始位置偏移量的查询方法. public interface Seekable{ //seek()可以移到文件中任意一个绝对位置 void seek(long pos); long getPos(); bool

聊聊高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference源码来看如何解决CAS的ABA问题

在聊聊高并发(十一)实现几种自旋锁(五)中使用了java.util.concurrent.atomic.AtomicStampedReference原子变量指向工作队列的队尾,为何使用AtomicStampedReference原子变量而不是使用AtomicReference是因为这个实现中等待队列的同一个节点具备不同的状态,而同一个节点会多次进出工作队列,这就有可能出现出现ABA问题. 熟悉并发编程的同学应该知道CAS操作存在ABA问题.我们先看下CAS操作. CAS(Compare and