elasticsearch elk最全java api 搜索 聚合、嵌套查询
目录
(八) rangeQuery(client); 范围查询... 4
(四) valueCountQuery(client); //统计个数... 8
(五) extendedStatsQuery(client);//统计聚合(一堆). 8
(六) percentileQuery(client). 9
(七) percentileRankQuery(client);//百分比... 9
(八) rangeQuery(client)//范围... 9
(九) histogramQuery(client);//柱状图聚合... 10
(十) dateHistogramQuery(client);// 按日期间隔分组... 10
(一) constantScoreQuery(client);11
(二) booQuery(client)(最常用)... 12
一、一般查询
(一)matchAllQuery(client)
matchAllQuery()方法用来匹配全部文档
|
public static void matchAllQuery(Client client ) { SearchResponse res = null; QueryBuilder qb = QueryBuilders.matchAllQuery(); res = client.prepareSearch("search_test") .setTypes("article") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(qb) .setFrom(0) .setSize(10) .execute().actionGet(); for (SearchHit hit: res.getHits().getHits()){ System.out.println(hit.getSourceAsString()); } |
for有选择的打印
|
1. for (SearchHit searchHit : searchHits) { 2. String name = (String) searchHit.getSource().get("name"); 3. String birth = (String) searchHit.getSource().get("birth"); 4. String interest = (String) searchHit.getSource().get("interest"); 5. System.out.println("-------------" + (++i) + "------------"); 6. System.out.println(name); 7. System.out.println(birth); 8. System.out.println(interest); 9. } |
(二)matchQuery(client);
不能写为matchQuery("name", "to*")
matchQuery("filedname","value")匹配单个字段,匹配字段名为filedname,值为value的文档
|
QueryBuilder qb = QueryBuilders.matchQuery("title", "article"); |
(三)multiMatchQuery(client);
多个字段匹配某一个值
1. QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("music",
2. "name", "interest");//搜索name中或interest中包含有music的文档(必须与music一致)
(四)wildcardQuery()模糊查询
模糊查询,?匹配单个字符,*匹配多个字符
[java] view plain copy
1. WildcardQueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name",
2. "*jack*");//搜索名字中含有jack文档(name中只要包含jack即可)
(五)commonTermQuery(client);
一种略高级的查询,充分考虑了stop-word的低优先级,提高了查询精确性。
将terms分为了两种:more-importent(low-frequency) and less important(high-frequency)。less-important比如stop-words,eg:the and。
QueryBuilder qb = QueryBuilders
.commonTermsQuery("title","article");
(六)termQuery(client);
* termQuery("key", obj) 完全匹配
* termsQuery("key", obj1, obj2..) 一次匹配多个值
QueryBuilder qb =QueryBuilders
.termQuery("title","article");
// QueryBuilder qb = QueryBuilders
// .termsQuery("title","article","relevence");
(七)testPrefixQuery前缀
参考网址:https://www.cnblogs.com/wenbronk/p/6432990.html
/**
* 前缀查询
*/
@Test
public void testPrefixQuery() {
QueryBuilder queryBuilder = QueryBuilders.matchQuery("user", "kimchy");
searchFunction(queryBuilder);
}
(八)rangeQuery(client);范围查询
// 闭区间 QueryBuilderquery = QueryBuilders.rangeQuery("age").from(10).to(20); // 开区间 QueryBuilder query = QueryBuilders.rangeQuery("age").gt(10).lt(20);
1、两种写法
QueryBuilder qb = QueryBuilders
.rangeQuery("like")
.gte(5)
.lt(7);
// QueryBuilderqb = QueryBuilders
// .rangeQuery("like")
// .from(5)
// .to(7)
// .includeLower(true)// 包含上届
// .includeUpper(false);// 包含下届
(九)nested query
在关系查询中,存在一对多和多对一的关系。因为就会出现两种查询情况。
在解释查询关系之前,需要理解一下Relationship Name,如文档中contact和account的关系 ,一个Account会有多个contact,一个Contact也会有多个Account,但是最终归结的关系为Account对contact的关系为一对多。也就是说 在contact上保存有对account'的引用,这个引用的名称就是RelationshipName(区别于field name),类似于外键的名称。
下面介绍两种查询
1、多对一的查询。
salesforce 中特有的__r模式,直接关联到parent上,如contact上存有对account的引用,那么我可以直接关联出account上的相关字段。
[sql] view plain copy
1. select id,name ,account.name,account.id from contact
2、一对多的查询
嵌入式查询(nestedquery),这种方式适合在父的一端查询相关子的记录。如:我想查找到负责这个account的全部contact。
[sql] view plain copy
1. select id,name,(select id,name from contacts)
2. from account
查询结果如图:
这样就会关联出所以的contact数据,contact部分的展示形式json串。注意contacts不是对象名称,是Relationshipname
(十)其他查询
QueryBuilder qb =QueryBuilders.existsQuery("str");
//QueryBuilder qb =QueryBuilders.prefixQuery("name", "prefix");
//QueryBuilder qb =QueryBuilders.regexpQuery("user", "k.*y");
正则表达式
/** * 模糊查询 * 不能用通配符, 不知道干啥用 */ //QueryBuilder qb = QueryBuilders.fuzzyQuery("name", "kimzhy"); |
//QueryBuilder qb =QueryBuilders.typeQuery("my_type");
/** * 只查询一个id的 * QueryBuilders.idsQuery(String...type).ids(Collection<String> ids) */ //QueryBuilder qb = QueryBuilders.idsQuery("my_type","type2").addIds("1","2","5"); |
二、聚合查询AggsQueryTest
(一)avgQuery(client);
publicstatic void avgQuery(Client client ) {
SearchResponseres = null;
AvgBuilderagg = AggregationBuilders
.avg("avg_num")
.field("like");
res= client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(10)
.execute().actionGet();
System.out.println(res);
//on shutdown
client.close();
}
(二)minQuery(client);
MinBuilderagg = AggregationBuilders
.min("min_num")
.field("like");
(三)maxQuery(client)
MaxBuilderagg = AggregationBuilders
.max("max_num")
.field("like");
(四)valueCountQuery(client); //统计个数
值计算聚合
SearchResponseres = null;
ExtendedStatsBuilderagg = AggregationBuilders
.extendedStats("extended_stats_num")
.field("like");
(五)extendedStatsQuery(client);//统计聚合(一堆)
返回聚合分析后所有指标,比Stats多三个统计结果:平方和、方差、标准差
|
1 2 3 4 5 |
{ "aggs" : { "grades_stats" : { "extended_stats" : { "field" : "grade" } } } } |
ExtendedStatsBuilder agg =AggregationBuilders.extendedStats("extended_stats_num").field("like");
(六)percentileQuery(client)
PercentilesBuilderagg = AggregationBuilders
.percentiles("percentile_num")
.field("like")
.percentiles(95,99,99.9);
(七)percentileRankQuery(client);//百分比
PercentileRanksBuilderagg = AggregationBuilders
.percentileRanks("percentile_rank_num")
.field("like")
.percentiles(3,5);
(八) rangeQuery(client)//范围
AggregationBuilder agg =
AggregationBuilders
.range("agg")
.field("like")
.addUnboundedTo(3)
.addRange(3, 5)
.addUnboundedFrom(5);
(九)histogramQuery(client);//柱状图聚合
(十)dateHistogramQuery(client);// 按日期间隔分组
(十一)获取聚合里面的结果
TopHitsBuilder thb= AggregationBuilders.topHits("top_result");
(十二)嵌套的聚合
NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");
(十三)反转嵌套
AggregationBuilders.reverseNested("res_negsted").path("kps ");
三、二级分组的例子:
上面这些基本就是常用的聚合查询了,在嵌套(nested)下面的子聚合查询就是嵌套查询了,除了嵌套查询,其他的聚合查询也可以无限级添加子查询
举个例子
SearchRequestBuildersearch= client.prepareSearch("index").setTypes("type");
TermsBuilderone= AggregationBuilders.terms("group_name").field("name");
TermsBuildertwo= AggregationBuilders.terms("group_age").field("age");
one.subAggregation(two)
search.addAggregation(one);
Terms terms=search.get().getAggregations().get("group_name");
for(Terms.Bucket name_buk:terms.getBuckets()){
//一级分组的内容
Terms terms_age= name_buk.getAggregations().get("group_age");
for(Terms.Bucket age_buk:terms_age.getBuckets()){
//二级分组的内容
System.out.println(name_buk.getKey()+" "+age_buk.getKey()+" "+age_buk.getDocCount());
}
}
四、嵌套查询
(一)constantScoreQuery(client);
/**
* 包裹查询, 高于设定分数, 不计算相关性
*/
@Test
public void testConstantScoreQuery() {
QueryBuilder queryBuilder = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("name", "kimchy")).boost(2.0f);
searchFunction(queryBuilder);
(二)booQuery(client)(最常用)
/**
* 组合查询
* must(QueryBuilders) : AND
* mustNot(QueryBuilders): NOT
* should: : OR
*/
publicstaticvoid booQuery(Client client) {//最有用的嵌套查询
SearchResponse res = null;
QueryBuilder qb =QueryBuilders.boolQuery()
.should(QueryBuilders.termQuery("title", "02"))
// .mustNot(QueryBuilders.termQuery("title","article"))
.should(QueryBuilders.termQuery("title", "relevance"));
// .filter(QueryBuilders.termQuery("title","article"));
res = client.prepareSearch("search_test").setTypes("article").setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb).setFrom(0).setSize(10).execute().actionGet();
for (SearchHit hit : res.getHits().getHits()) {
System.out.println(hit.getSourceAsString());
}
1、经典案例
如果需要查询(addr = Beijing) && (sex = false) && (10 < age< 20)的doc:
public static QueryBuilder createQuery() {
BoolQueryBuilder query =QueryBuilders.boolQuery();
// addr = Beijing
query.must(new QueryStringQueryBuilder("Beijing").field("addr"));
// sex = falese
query.must(new QueryStringQueryBuilder("false").field("sex"));
// age ∈ (10,20)
query.must(new RangeQueryBuilder("age").gt(10).lt(20));
return query;
}
返回结果:
{"pid":168,"age":16,"sex":false,"name":"Tom","addr":"Beijing"}
{"pid":276,"age":19,"sex":false,"name":"Bill","addr":"Beijing"}
{"pid":565,"age":16,"sex":false,"name":"Brown","addr":"Beijing"}
{"pid":73,"age":13,"sex":false,"name":"David","addr":"Beijing"}
作者:唐影若凡
链接:https://www.jianshu.com/p/a3694b13bf89
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
(三)disMaxQuery(client);
/**
* disMax查询
* 对子查询的结果做union, score沿用子查询score的最大值,
* 广泛用于muti-field查询
*/
@Test
public void testDisMaxQuery() {
QueryBuilder queryBuilder = QueryBuilders.disMaxQuery()
.add(QueryBuilders.termQuery("user", "kimch")) // 查询条件
.add(QueryBuilders.termQuery("message", "hello"))
.boost(1.3f)
.tieBreaker(0.7f);
searchFunction(queryBuilder);
}
五、本案例数据导入
curl -XPUT'http://169.254.135.217:9200/search_test/' -d '{
"settings" : {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
},
"mappings" : {
"article" : {
"properties" : {
"title" : { "type" : "string"},
"body" : { "type" : "string"},
"like" : { "type" : "long"},
"publish_date" : { "type" : "date"}
}
}
}
}'
curl -XGET'http://169.254.135.217:9200/search_test/_mapping?pretty'
curl -XGET'http://169.254.135.217:9200/search_test/_mapping/article?pretty'
curl -XHEAD -i'http://169.254.135.217:9200/search_test/article'
/search_test/article/1
{
"title": "What's relevance?",
"body": "atticle body of relevence:Term frequency/inversedocument frequency",
"like": "1",
"publish_date": "2016-03-24"
}
/search_test/article/2
{
"title": "article 02",
"body": "article 02 atticlebody of relevence:Term frequency/inverse document frequency",
"like": "2",
"publish_date":"2016-05-24"
}
/search_test/article/3
{
"title": "article 03",
"body": "article 03 atticlebody of relevence:Term frequency/inverse document frequency",
"like": "3",
"publish_date":"2016-07-24"
}
/search_test/article/4
{
"title": "article 04",
"body": "article 04 atticlebody of relevence:Term frequency/inverse document frequency",
"like": "4",
"publish_date":"2016-09-24"
}
/search_test/article/5
{
"title": "article 05",
"body": "article 04 atticlebody of relevence:Term frequency/inverse document frequency",
"like": "5",
"publish_date":"2016-11-24"
}
/search_test/article/6
{
"title": "Quick brownrabbits",
"body": "Brown rabbits arecommonly seen.",
"like": "6",
"publish_date":"2016-12-24"
}
/search_test/article/7
{
"title": "Keeping petshealthy",
"body": "My quick brown foxeats rabbits on a regular basis.",
"like": "7",
"publish_date":"2017-11-24"
}
elasticsearch elk最全java api 搜索 聚合、嵌套查询的更多相关文章
- Elasticsearch 2.3.3 JAVA api说明文档
原文地址:https://www.blog-china.cn/template\documentHtml\1484101683485.html 翻译作者:@青山常在人不老 加入翻译:cdcnsuper ...
- mysql转ElasticSearch的分析 及JAVA API 初探
前言 最近工作中在进行一些技术优化,为了减少对数据库的压力,对于只读操作,在程序与db之间加了一层-ElasticSearch.具体实现是db与es通过bin-log进行同步,保证数据一致性,代码调用 ...
- ElasticSearch 5.0.1 java API操作
今天来说下使用ES 5.0.1的API来进行编码. 开始之前,简单说下5.0.1跟之前的几个变化.之前的ES自身是不支持delete-by-query的,也就是通过查询来删除,可以达到批量的效果,是因 ...
- java mongoDB 二级数组嵌套查询
场景: 会员集合下有多个会员文档,会员文档下有多个订单文档,订单买了多个商品文档 member->orders>orderItems 要求: 通过会员id和商品id验证会员是否购买过该商品 ...
- ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程
前言 在上一篇中介绍了ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解,本篇文章就来讲解下 ElasticSearch 6.x官方Java API的 ...
- ElasticSearch6(三)-- Java API实现简单的增删改查
基于ElasticSearch6.2.4, Java API创建索引.查询.修改.删除,pom依赖和获取es连接 可查看此文章. package com.xsjt.learn; import java ...
- Elasticsearch Java API 很全的整理
Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种.相比来说transportClient API效率更高, ...
- Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...
- Elasticsearch JAVA api搞定groupBy聚合
本文给出如何使用Elasticsearch的Java API做类似SQL的group by聚合.为了简单起见,只给出一级groupby即group by field1(而不涉及到多级,例如group ...
随机推荐
- 百度地图和高德地图结合在web中的使用(二)
百度地图在web中的使用(二) 背景:在做一个关于地理位置字段时,初始位置使用百度地图获取时失败,获取的位置信息不准确,奈何产品说友商好使的啊,F12看后是采用的高德,所以在这采用高德地图获取初始位置 ...
- docker:版本变更
在2017年之前的版本号: v1.4, v1.5, v1.6, v1.7, v1.8, v1.9, v1.10, v1.11, v1.12, v1.13 从2017年开始版本后变更为:${yy} ...
- mysql 中的内置函数
一.字符串函数 select concat(name,"age is",age) from users; insert(str,x,y,insert)//将字符串x位置开始y个位 ...
- python发展史
一:Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum)(龟叔).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹 打发时间,决心开发一个新的脚本解释程序, ...
- es6的正则扩展笔记之修饰符
es6对于正则表达式添加了 u 修饰符和 y 修饰符. u 修饰符:含义为“Unicode模式”,用来正确处理大于\uFFFF的Unicode字符. 该修饰符不光会正确处理正则表达式,还会正确处 ...
- 03.Python网络爬虫第一弹《Python网络爬虫相关基础概念》
爬虫介绍 引入 之前在授课过程中,好多同学都问过我这样的一个问题:为什么要学习爬虫,学习爬虫能够为我们以后的发展带来那些好处?其实学习爬虫的原因和为我们以后发展带来的好处都是显而易见的,无论是从实际的 ...
- Mysql 数据库设置三大范式 数据库五大约束 数据库基础配置
数据库设置三大范式 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式. 第一范式的合理遵循需要根据系统给的实际需求 ...
- w3m 在ubuntu中的使用
w3m 使用总结 安装 sudo apt install w3m终端 w3m www.baidu.com 即可打开w3m是个开放源代码的命令行下面的网页浏览器.一般的linux系统都会自带这个工具,可 ...
- 使用ECharts来实现地图下钻功能(某省的市级下钻到县级)
var cityMap = { "长沙市": "430100", "株洲市": "430200", "湘潭市& ...
- 电脑如何用HDMI连接电视
因为现在的液晶电视基本上都有VGA接口,所以你可以很容易地用VGA线实现电脑连接电视上,但是该文有一个地方没有提到,那就是分辨率的问 题,现在的液晶电视的主流面板已经是全高清面板(1920X1080) ...