elasticsearch组合多条件查询实现restful api以及java代码实现
原文: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 */@Testpublic 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 */@Testpublic 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 */@Testpublic 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代码实现的更多相关文章
- elasticsearch查询所有数据restful api以及java代码实现
原文:http://blog.java1234.com/blog/articles/366.html restful api实现如下: get http://192.168.1.111:9200/fi ...
- [NHibernate]条件查询Criteria Query
目录 写在前面 文档与系列文章 条件查询 一个例子 总结 写在前面 上篇文章介绍了HQL查询,我个人觉得使用ORM框架就是为了让少些sql,提高开发效率,而再使用HQL就好像还是使用sql,就觉得有点 ...
- 利用koa打造restful API
概述 最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用. 就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获 ...
- 具有SSM框架的CRUD与多条件查询
概述 居于ssm版本的crud跟多添加查询, 并带分页的demo 详细 代码下载:http://www.demodashi.com/demo/13653.html 一.功能展示 部门CRUD: 员工C ...
- oracle 在xml中批量插入,批量修改及多组条件查询
最近公司用ibatis开发项目,本来可以用存储过程处理批量插入,批量修改及多组条件查询:但由于使用模块相对较小,暂时就在xml中配置,以前没有在xml做过类似处理,有必要记录一下:好了,代码如下: & ...
- 可以执行全文搜索的原因 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 ...
- 利用kibana学习 elasticsearch restful api (DSL)
利用kibana学习 elasticsearch restful api (DSL) 1.了解elasticsearch基本概念Index: databaseType: tableDocument: ...
- RESTful API URI 设计: 查询(Query)和标识(Identify)
相关文章:RESTful API URI 设计的一些总结. 问题场景:删除一个资源(Resources),URI 该如何设计? 应用示例:删除名称为 iPhone 6 的产品. 是不是感觉很简单呢?根 ...
- Elasticsearch入坑指南之RESTful API
Elasticsearch入坑指南之RESTful API Tags:Elasticsearch ES为开发者提供了非常丰富的基于Http协议的Rest API,通过简单的Rest请求,就可以实现非常 ...
随机推荐
- Vue-cli 中安装并使用less
首先安装vue-cli,网站教程多多,在这不多说.接下来在vue项目目录下,运行 其他扩展使用方法我放个官网链接,大家可以点击查看 npm install less less-loader --sav ...
- LG2852/BZOJ1717 「USACO2006DEC」Milk Patterns 离散化+后缀数组
问题描述 LG2852 题解 字符串性质:字符串\(s\)的每个字串等于每个后缀的所有前缀 对输入的东西离散化,然后把数值看做\(\mathrm{ASCII}\)后缀排序 二分答案,二分长度. 显然一 ...
- Gym101667 H. Rock Paper Scissors
将第二个字符串改成能赢对方时对方的字符并倒序后,字符串匹配就是卷积的过程. 那么就枚举字符做三次卷积即可. #include <bits/stdc++.h> struct Complex ...
- b站滑动验证码图片的获取-python
本文仅是获取验证码图片,python+selenium实现 图片的处理,算出偏移位置网上都有现成的:而由于b站的更新,图片的获取则与之前完全不同,不能直接从html中拿到 过程比较曲折所以记录一下,可 ...
- [POI2011]Lightening Conductor(决策单调性)
好久没写过决策单调性了. 这题其实就是 $p_i=\lceil\max\limits_{j}(a_j-a_i+\sqrt{|i-j|})\rceil$. 拆成两边,先只考虑 $j<i$,然后反过 ...
- [LeetCode] 214. Shortest Palindrome 最短回文串
Given a string s, you are allowed to convert it to a palindrome by adding characters in front of it. ...
- Metasploit 常用命令手册
Installation curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/template ...
- HDU 4005 The war(边双连通)
题意 给定一张 \(n\) 个点 \(m\) 条边的无向连通图,加入一条边,使得图中权值最小的桥权值最大,如果能使图中没有桥则输出 \(-1\). 思路 先对原图边双缩点,然后变成了一棵树.在 ...
- 推荐一款移动端天气App即刻天气
推荐一款移动端天气App即刻天气 一 应用描述 即刻天气预报是一个提供全国各城市15日天气预报和空气质量的APP,包含全国3000个城市天气预报,3万个乡镇天气,15日及48小时空气质量预报,是万千用 ...
- MySQL基础指令和安装
数据库概念 那Mysql能干嘛呢?它就是一款软件,安装在任何一台计算机或者服务器上的时候,只要我告诉它创建一个文件,新增一个数据,删除一个数据它就能帮我去做想要的操作 那我们暂且能不能理解为mysql ...