原文:http://blog.java1234.com/blog/articles/372.html

elasticsearch组合多条件查询实现restful api以及java代码实现

实际开发中,基本都是组合多条件查询。

elasticsearch提供bool来实现这种需求;

主要参数:

must

文档 必须 匹配这些条件才能被包含进来。

must_not

文档 必须不 匹配这些条件才能被包含进来。

should

如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。

filter

必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

OK我们这里多搞几个实例让大伙体验下;

最简单的 模糊查询标题含有“战”:

post:http://192.168.1.111:9200/film/dongzuo/_search/

{

"query": {

"bool": {

"must":{"match":{"title":"战"}}

}

}

}

多条件的话

{

"query": {

"bool": {

"must":[

{"match":{"title":"战"}},

{"match":{"content":"星球"}}

]

}

}

}

就一条结果了;

java代码实现:

/**
 * 多条件查询
 * @throws Exception
 */
@Test
public void searchMutil()throws Exception{
    SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
    QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title""战");
    QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content""星球");
    SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
            .must(queryBuilder)
            .must(queryBuilder2))
        .execute()
        .actionGet(); 
    SearchHits hits=sr.getHits();
    for(SearchHit hit:hits){
        System.out.println(hit.getSourceAsString());
    }
}

运行结果:

ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...

{"title":"星球大战8:最后的绝地武士","publishDate":"2018-01-05","content":"《星球大战:最后的绝地武士》承接前作《星球大战:原力觉醒》的剧情,讲述第一军团全面侵袭之下,蕾伊(黛西·雷德利 Daisy Ridley 饰)、芬恩(约翰·博耶加 John Boyega 饰)、波·达默龙(奥斯卡·伊萨克 Oscar Isaac 饰)三位年轻主角各自的抉 择和冒险故事。前作中觉醒强大原力的蕾伊独自寻访隐居的绝地大师卢克·天行者(马克·哈米尔 Mark Hamill 饰),在后者的指导下接受原力训练。芬恩接受了一项几乎不可能完成的任务,为此他不得不勇闯敌营,面对自己的过去。波·达默龙则要适应从战士向领袖的角色转换,这一过程中他也将接受一些血的教训。","director":"莱恩·约翰逊","price":"55"}

must_not使用

内容里不含有“武士”

{

"query": {

"bool": {

"must":{"match":{"title":"战"}},

"must_not":{"match":{"content":"武士"}}

}

}

}

结果:

java代码实现:

/**

* 多条件查询

* @throws Exception

*/

@Test

public void searchMutil2()throws Exception{

SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");

QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "战");

QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content", "武士");

SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()

.must(queryBuilder)

.mustNot(queryBuilder2))

.execute()

.actionGet();

SearchHits hits=sr.getHits();

for(SearchHit hit:hits){

System.out.println(hit.getSourceAsString());

}

}

结果一致;

should使用 提高得分;

前面:

{

"query": {

"bool": {

"must":[

{"match":{"title":"战"}}

]

}

}

}

得分情况我们看下:

我们加下should

{

"query": {

"bool": {

"must":{"match":{"title":"战"}},

"should":[

{"match":{"content":"星球"}},

{"range":{"publishDate":{"gte":"2018-01-01"}}}

]

}

}

}

执行下:

自己看得分 不解释;

java代码实现:

/**
 * 多条件查询
 * @throws Exception
 */
@Test
public void searchMutil3()throws Exception{
    SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
    QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title""战");
    QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content""星球");
    QueryBuilder queryBuilder3=QueryBuilders.rangeQuery("publishDate").gt("2018-01-01");
    SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
            .must(queryBuilder)
            .should(queryBuilder2)
            .should(queryBuilder3))
        .execute()
        .actionGet(); 
    SearchHits hits=sr.getHits();
    for(SearchHit hit:hits){
        System.out.println(hit.getScore()+":"+hit.getSourceAsString());
    }
}

执行:

省略

filter过滤;

票价必须少于40

{

"query": {

"bool": {

"must": {

"match": {"title": "战"}

},

"filter": {

"range": {"price": {"lte":"40"}}

}

}

}

}

执行:

java代码实现:

/**
 * 多条件查询
 * @throws Exception
 */
@Test
public void searchMutil4()throws Exception{
    SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
    QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title""战");
    QueryBuilder queryBuilder2=QueryBuilders.rangeQuery("price").lte(40);
    SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
            .must(queryBuilder)
            .filter(queryBuilder2))
        .execute()
        .actionGet(); 
    SearchHits hits=sr.getHits();
    for(SearchHit hit:hits){
        System.out.println(hit.getSourceAsString());
    }
}

运行结果一致;

elasticsearch组合多条件查询实现restful api以及java代码实现的更多相关文章

  1. elasticsearch查询所有数据restful api以及java代码实现

    原文:http://blog.java1234.com/blog/articles/366.html restful api实现如下: get http://192.168.1.111:9200/fi ...

  2. [NHibernate]条件查询Criteria Query

    目录 写在前面 文档与系列文章 条件查询 一个例子 总结 写在前面 上篇文章介绍了HQL查询,我个人觉得使用ORM框架就是为了让少些sql,提高开发效率,而再使用HQL就好像还是使用sql,就觉得有点 ...

  3. 利用koa打造restful API

    概述 最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用. 就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获 ...

  4. 具有SSM框架的CRUD与多条件查询

    概述 居于ssm版本的crud跟多添加查询, 并带分页的demo 详细 代码下载:http://www.demodashi.com/demo/13653.html 一.功能展示 部门CRUD: 员工C ...

  5. oracle 在xml中批量插入,批量修改及多组条件查询

    最近公司用ibatis开发项目,本来可以用存储过程处理批量插入,批量修改及多组条件查询:但由于使用模块相对较小,暂时就在xml中配置,以前没有在xml做过类似处理,有必要记录一下:好了,代码如下: & ...

  6. 可以执行全文搜索的原因 Elasticsearch full-text search Kibana RESTful API with JSON over HTTP elasticsearch_action es 模糊查询

    https://www.elastic.co/guide/en/elasticsearch/guide/current/getting-started.html Elasticsearch is a ...

  7. 利用kibana学习 elasticsearch restful api (DSL)

    利用kibana学习 elasticsearch restful api (DSL) 1.了解elasticsearch基本概念Index: databaseType: tableDocument: ...

  8. RESTful API URI 设计: 查询(Query)和标识(Identify)

    相关文章:RESTful API URI 设计的一些总结. 问题场景:删除一个资源(Resources),URI 该如何设计? 应用示例:删除名称为 iPhone 6 的产品. 是不是感觉很简单呢?根 ...

  9. Elasticsearch入坑指南之RESTful API

    Elasticsearch入坑指南之RESTful API Tags:Elasticsearch ES为开发者提供了非常丰富的基于Http协议的Rest API,通过简单的Rest请求,就可以实现非常 ...

随机推荐

  1. Sentinel 学习资料

    Sentinel 学习资料 网址 官方github https://github.com/alibaba/Sentinel 官方中文文档 https://github.com/alibaba/Sent ...

  2. 莫烦TensorFlow_05 add_layer

    import tensorflow as tf import numpy as np def add_layer(inputs, in_size, out_size, activation_funct ...

  3. 接口规范、容错处理规则、aph备份数据规则

    前话:前后解耦,前端开发环节使用APH,后台开发环节postman(可考虑为后台也做一个aph后台版) 1.api标准:标识符(ret:1为正常数据,0为接口报错),数据体(data:api的数据容器 ...

  4. django settings实现原理及自定义项目settings配置

    基于django 中的settings实现原理,实现自己项目配置文件的可插拔式设计 ##首先说一下django中settings.py中的实现原理 ''' 应该明确一点,django暴露给用户一个自定 ...

  5. webdriver模拟鼠标操作

    ActionChains 生成模拟用户操作的对象 from selenium.webdriver.common.action_chains import ActionChains ActionChai ...

  6. HTTP几种认证方式介绍

    HTTP提供了一套标准的身份验证框架:服务器可以用来针对客户端的请求发送质询(challenge),客户端根据质询提供身份验证凭证.质询与应答的工作流程如下:服务器端向客户端返回401(Unautho ...

  7. bikemanager

    项目特色 前言的技术栈  健全的架构  丰富的UI组件  共享单车项目 掌握react全家桶 掌握地图和react集成技能 掌握前端图标开发技巧 掌握antd UI框架 前端后台架构设计,公共机制封装 ...

  8. appium--多点触控

    前戏 对于放大缩小的,我们使用前面的滑动是不行的,例如地图的放大缩小,这里就要用到多点触控了 MultiAction是多点触控的类,可以模拟多点触控操作,主要包含add()和perform()两个方法 ...

  9. [LeetCode] 145. Binary Tree Postorder Traversal 二叉树的后序遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  10. Spring Boot中整合Sharding-JDBC单库分表示例

    本文是Sharding-JDBC采用Spring Boot Starter方式配置第二篇,第一篇是读写分离讲解,请参考:<Spring Boot中整合Sharding-JDBC读写分离示例> ...