目录

一、 一般查询... 2

(一) matchAllQuery(client). 2

(二) matchQuery(client);3

(三) multiMatchQuery(client);3

(四) wildcardQuery()模糊查询... 3

(五) commonTermQuery(client);3

(六) termQuery(client);4

(七) testPrefixQuery前缀... 4

(八) rangeQuery(client); 范围查询... 4

1、 两种写法... 5

(九) nested query. 5

(十) 其他查询... 6

二、 聚合查询AggsQueryTest7

(一) avgQuery(client);7

(二) minQuery(client);8

(三) maxQuery(client). 8

(四) valueCountQuery(client); //统计个数... 8

值计算聚合... 8

(五) extendedStatsQuery(client);//统计聚合(一堆). 8

(六) percentileQuery(client). 9

(七) percentileRankQuery(client);//百分比... 9

(八) rangeQuery(client)//范围... 9

(九) histogramQuery(client);//柱状图聚合... 10

(十) dateHistogramQuery(client);// 按日期间隔分组... 10

(十一) 获取聚合里面的结果... 10

(十二) 嵌套的聚合... 10

(十三) 反转嵌套... 10

三、 二级分组的例子:... 10

四、 嵌套查询... 11

(一) constantScoreQuery(client);11

(二) booQuery(client)(最常用)... 12

1、 经典案例... 12

(三) disMaxQuery(client);13

五、 本案例数据导入... 14

一、一般查询

(一)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)下面的子聚合查询就是嵌套查询了,除了嵌套查询,其他的聚合查询也可以无限级添加子查询

举个例子

SearchRequestBuilder search = client.prepareSearch("index").setTypes("type");
 
TermsBuilder one=  AggregationBuilders.terms("group_name").field("name");
TermsBuilder two=  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 搜索 聚合、嵌套查询的更多相关文章

  1. Elasticsearch 2.3.3 JAVA api说明文档

    原文地址:https://www.blog-china.cn/template\documentHtml\1484101683485.html 翻译作者:@青山常在人不老 加入翻译:cdcnsuper ...

  2. mysql转ElasticSearch的分析 及JAVA API 初探

    前言 最近工作中在进行一些技术优化,为了减少对数据库的压力,对于只读操作,在程序与db之间加了一层-ElasticSearch.具体实现是db与es通过bin-log进行同步,保证数据一致性,代码调用 ...

  3. ElasticSearch 5.0.1 java API操作

    今天来说下使用ES 5.0.1的API来进行编码. 开始之前,简单说下5.0.1跟之前的几个变化.之前的ES自身是不支持delete-by-query的,也就是通过查询来删除,可以达到批量的效果,是因 ...

  4. java mongoDB 二级数组嵌套查询

    场景: 会员集合下有多个会员文档,会员文档下有多个订单文档,订单买了多个商品文档 member->orders>orderItems 要求: 通过会员id和商品id验证会员是否购买过该商品 ...

  5. ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程

    前言 在上一篇中介绍了ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解,本篇文章就来讲解下 ElasticSearch 6.x官方Java API的 ...

  6. ElasticSearch6(三)-- Java API实现简单的增删改查

    基于ElasticSearch6.2.4, Java API创建索引.查询.修改.删除,pom依赖和获取es连接 可查看此文章. package com.xsjt.learn; import java ...

  7. Elasticsearch Java API 很全的整理

    Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种.相比来说transportClient API效率更高, ...

  8. Elasticsearch java api 基本搜索部分详解

    文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...

  9. Elasticsearch JAVA api搞定groupBy聚合

    本文给出如何使用Elasticsearch的Java API做类似SQL的group by聚合.为了简单起见,只给出一级groupby即group by field1(而不涉及到多级,例如group ...

随机推荐

  1. Python入门练习

    0.基本知识 Number.String.Lists 1.if判断的使用       

  2. QT 调用VS2015编写的Dll

    最近在用QT调用VC生成的库,QT使用的是MinGW调试器,出现与动态库不兼容的问题,最后发现QT只能识别VC生成的C格式下的动态库 也就是在导入导出设置时加入extern "C" ...

  3. 对《神奇的C语言》文中例子 5 代码的分析讨论

    在春节前,我曾经参与在<神奇的C语言>一文中的例子(5)的讨论,但限于评论内容的有限,现在本文再次对这个问题单独讨论.(此问题原貌,详见<神奇的C语言>,这里我将原文中的代码稍 ...

  4. LINUX下软件包的安装与使用

    1.安装RPM包 rpm -ivh 包全名 2.查询某个包是否安装 rpm -q 包名 3.查询已安装的包的信息(主要看版本) rpm -qi 包名 4.查询已安装包的安装位置 rpm -ql 包名 ...

  5. 刀哥多线程之主队列gcd-06-main_queue

    主队列 特点 专门用来在主线程上调度任务的队列 不会开启线程 以先进先出的方式,在主线程空闲时才会调度队列中的任务在主线程执行 如果当前主线程正在有任务执行,那么无论主队列中当前被添加了什么任务,都不 ...

  6. java高并发,如何解决,什么方式解决

    之前我将高并发的解决方法误认为是线程或者是队列可以解决,因为高并发的时候是有很多用户在访问,导致出现系统数据不正确.丢失数据现象,所以想到 的是用队列解决,其实队列解决的方式也可以处理,比如我们在竞拍 ...

  7. hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值

    Conturbatio Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...

  8. TCP/IP协议原理与应用笔记09:数据通信---封装

    2016-08-091. 数据通信----封装: 2. 协议数据单元: PDU:对等层数据通信的单元. 比如Source端的应用层 和 Destination端的应用层是对等层(L7),这个时候L7 ...

  9. SQL SERVER服务器登录名、角色、数据库用户、角色、架构的关系

    原创链接:https://www.cnblogs.com/junfly/articles/2798023.html SQL SERVER 基础教程中关于服务器登录名.服务器角色.数据库用户.数据库角色 ...

  10. deepin配置Oracle JDK

    这里记录一下入手deepin后,安装JDK的过程,和之前的CentOS有些不同 本篇参考了两篇博客 1 2 第一篇有些问题,在第二篇中找到了解决方案 接下来是操作过程: 检查本机自带的OpenJDK, ...