1. 程式人生 > >ElasticSearch的查詢相關操作---使用es的api和結果遍歷

ElasticSearch的查詢相關操作---使用es的api和結果遍歷

QueryBuilders:
QueryBuilders:
    boolQuery:
        must:相當於sql的and
        must not:相當於sql的not
        should:相當於sql的or
    mathcquery:單個匹配
    mathcAllQuery:匹配所有
    termQuery:termQuery("key", obj) 完全匹配 ;termsQuery("key", obj1, obj2..)  一次匹配多個值
    multiMatchQuery:multiMatchQuery("text", "field1", "field2"..);  匹配多個欄位, field有萬用字元忒行
    idsQuery:構造一個只會匹配的特定資料 id 的查詢
    constantScoreQuery:看了一下這個類的建構函式ConstantScoreQuery(Filter filter) ,我的理解就是通過構造filter來完成文件的過濾,並且返回一個複合當前過濾條件的文件的常量分數,這個分數等於為查詢條件設定的boost
    fuzzyQuery:模糊查詢
    moreLikeThisQuery:文件中的文字查詢
    prefixQuery:字首查詢
    rangeQuery:在一個範圍內查詢相匹配的文件
    termQuery:一個查詢相匹配的檔案包含一個術語
    termsQuery:一個查詢相匹配的多個value---minimumMatch(1); // 設定最小數量的匹配提供了條件。預設為1。
    wildcardQuery:萬用字元查詢
    nestedQuery:巢狀查詢---scoreMode("total");// max, total, avg or none
    disMaxQuery:對子查詢的結果做union, score沿用子查詢score的最大值,
    spanFirstQuery:跨度查詢,還包括(spanNearQuery,spanNotQuery,spanOrQuery,spanTermQuery)

其他欄位解釋:

percent_terms_to_match:匹配項(term)的百分比,預設是0.3
    min_term_freq:一篇文件中一個詞語至少出現次數,小於這個值的詞將被忽略,預設是2
    max_query_terms:一條查詢語句中允許最多查詢詞語的個數,預設是25
    stop_words:設定停止詞,匹配時會忽略停止詞
    min_doc_freq:一個詞語最少在多少篇文件中出現,小於這個值的詞會將被忽略,預設是無限制
    max_doc_freq:一個詞語最多在多少篇文件中出現,大於這個值的詞會將被忽略,預設是無限制
    min_word_len:最小的詞語長度,預設是0
    max_word_len:最多的詞語長度,預設無限制
    boost_terms:設定詞語權重,預設是1
    boost:設定查詢權重,預設是1
    analyzer:設定使用的分詞器,預設是使用該欄位指定的分詞器

操作例子(es版本還是1.7.2):

//查詢某個醫生的明細-- boolean query and 條件組合查詢(時間+護士名稱)
BoolQueryBuilder must = QueryBuilders.boolQuery().must(
        QueryBuilders.matchQuery("name_doc", "681_護士206"))
        .must(QueryBuilders.rangeQuery("yke123").gte(startTime + START_DATE_YUE)
        .lte(endTime + END_DATE_YUE));
SearchResponse searchResponse = mSRB.setQuery(must).execute().actionGet();
/**
 * 在es中所有的查詢結果都會儲存在SearchResponse中,在從SearchResponse中讀取資料的時候,有兩種方式:第一種是對Query的結果進行讀取,
 * 使用的是hit,每一條查詢到的doc都是一個hit,可以將每個hit轉換為map形式的資料,map的具體形式為<"field","value">的形式
 */
for(SearchHit hit:searchResponse.getHits()){
    Map<String, Object> source = hit.getSource();//每條資料
    if (!source.isEmpty()) {
        String name_depa=(String) source.get("name_depa");
        String name_doc=(String)source.get("name_doc");
        System.out.println(name_depa+"=="+name_doc);
    }
}
//查詢該人的工時
SearchResponse searchResponse1 = mSRB.setQuery(must).addAggregation(AggregationBuilders.sum("hushi").field("hushi")).get();
InternalSum hushi = searchResponse1.getAggregations().get("hushi");
System.out.println("總工的工時"+hushi.getValue());
/**
 * 第二種方式是針對查詢中的聚合問題(aggregation),聚合完成後的每條doc都是一個bucket(桶),他的訪問只能通過bucket來進行,而不能使用hit
 */
//設定聚合查詢條件---使用SearchResponse封裝結果
SearchResponse searchResponse3 = mSRB.addAggregation(AggregationBuilders.terms("name_doc").field("name_doc").size(0))//返回所有資料用0
        .execute().actionGet();
System.out.println(searchResponse);
Terms depa_count = searchResponse.getAggregations().get("name_doc");
for (Terms.Bucket bucket : depa_count.getBuckets()) {
    String name_depa = bucket.getKey();//科室名稱
    long docCount = bucket.getDocCount();//科室出現的次數

    System.out.println(name_depa + "==" + docCount);
}
//該醫生在該月的總條數
long l = searchResponse.getHits().totalHits();
System.out.println(l+"===============");

使用遊標sroll進行分頁查詢遍歷

client = (Client) Pools.getPool().borrowObject();//從連結池中獲取客戶端
//構建查詢器
SearchRequestBuilder mSRB = client
        .prepareSearch(index1)//索引--查詢工時表
        .setSearchType(SearchType.SCAN)//設定查詢型別--DFS_QUERY_THEN_FETCH
        .setSize(100).setScroll(TimeValue.timeValueMinutes(8));
String startTime = "2013-08";
String endTime = "2013-09";
String timeType = "0";
BoolQueryBuilder must = QueryBuilders.boolQuery()
        //.must(QueryBuilders.matchQuery("name_doc", "681_護士206"))
        .must(QueryBuilders.rangeQuery("yke123").gte(startTime + START_DATE_YUE)
                .lte(endTime + END_DATE_YUE));
SearchResponse searchResponse = mSRB.setQuery(must).execute().actionGet();
//使用scroll遍歷查詢的資料
Date begin = new Date();
long count = searchResponse.getHits().getTotalHits();//第一次不返回資料
for(int i=0,sum=0; sum<count; i++){
    searchResponse = client.prepareSearchScroll(searchResponse.getScrollId())
            .setScroll(TimeValue.timeValueMinutes(8))
            .execute().actionGet();
    sum += searchResponse.getHits().hits().length;
    for(SearchHit hit:searchResponse.getHits()){
        Map<String, Object> source = hit.getSource();
        String name_depa=(String) source.get("name_depa");
        String name_doc=(String)source.get("name_doc");
        String yke123=(String)source.get("yke123");
        System.out.println("科室:"+name_depa+"醫生:"+name_doc+"開單時間:"+yke123);
    };
    System.out.println("總量"+count+" 已經查到"+sum);
}
Date end = new Date();
System.out.println("耗時: "+(end.getTime()-begin.getTime()));

引用他人的http://blog.csdn.net/xr568897472/article/details/73826255:

  1. (1)統計某個欄位的數量  
  2.   ValueCountBuilder vcb=  AggregationBuilders.count("count_uid").field("uid");  
  3. (2)去重統計某個欄位的數量(有少量誤差)  
  4.  CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");  
  5. (3)聚合過濾  
  6. FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));  
  7. (4)按某個欄位分組  
  8. TermsBuilder tb=  AggregationBuilders.terms("group_name").field("name");  
  9. (5)求和  
  10. SumBuilder  sumBuilder= AggregationBuilders.sum("sum_price").field("price");  
  11. (6)求平均  
  12. AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price");  
  13. (7)求最大值  
  14. MaxBuilder mb= AggregationBuilders.max("max_price").field("price");   
  15. (8)求最小值  
  16. MinBuilder min= AggregationBuilders.min("min_price").field("price");  
  17. (9)按日期間隔分組  
  18. DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");  
  19. (10)獲取聚合裡面的結果  
  20. TopHitsBuilder thb=  AggregationBuilders.topHits("top_result");  
  21. (11)巢狀的聚合  
  22. NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");  
  23. (12)反轉巢狀  
  24. AggregationBuilders.reverseNested("res_negsted").path("kps ");  

相關推薦

ElasticSearch查詢相關操作---使用es的api結果

QueryBuilders: QueryBuilders: boolQuery:

資料結構之圖篇(2):圖的基本操作 深度廣度

程式碼實現 main.cpp(主函式) #include <iostream> #include "CMap.h" using namespace std; /** 圖的的儲存:鄰接矩陣 圖的遍歷:深度+廣度 A / \

Django框架詳細介紹---ORM相關操作---select_relatedprefetch_related函數對 QuerySet 查詢的優化

ger AS AI 出版社 獲得 har 有效 object 庫存 Django的 select_related 和 prefetch_related 函數對 QuerySet 查詢的優化 引言   在數據庫存在外鍵的其情況下,使用select_related()和pref

XML DTD約束 對xml文件的crud的查詢Read Retrieve操作 xml遞歸

exception 文件的 rgs oid ioe 8.0 private throws wid 本地的dtd文檔 xml中引入dtd文檔 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 書架 SY

(字符串的操作 for循環 while循環)

isdigit find 計數 capi 劉德華 序列 apc 負數 itl 1)字符串是什麽,和字符串的常用操作方法 1,什麽是字符串. 字符:是單一的文字符號, 字符串:是有序的字符序列,由" ‘ ‘‘‘ """引起來的內容就是字

Elasticsearch查詢match、termbool區別

es中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。 由於DSL查詢更為直觀也更為簡易,所以大都使用這種方式。 DSL查詢是POST過去一個json,由於post的請求是json格式的,所以存在很多靈活性,也有很多形式。 這裡有一個地方注意的

C++:二叉查詢樹實現(二)——操作

     建立好二叉樹,有時候我們需要對整個二叉樹錦星遍歷,即輸出二叉樹的所有結點元素。理論上,遍歷的方式有無數種,順序可以自己任意選定,但是絕大部分遍歷方式在實際中並沒有用處,比較有用的的遍歷方式有兩種:廣度優先遍歷、深度優先遍歷。 (1)廣度優先遍歷        

C/C++實現平衡二叉樹的插入、刪除、查詢各種

1 平衡二叉樹的插入      關於平衡二叉樹的定義什麼的,就不再多說。直接說說各種功能的c語言實現。 首先插入的時候需要進行旋轉以保證樹始終保持平衡。而旋轉的型別有四種:L-L型旋轉,L-R型旋轉,R-L型旋轉,R-R型旋轉。其中L-L型和R-R型只需要進行一次基本旋轉操作

分別用ShellPython查詢Hdfs檔案路徑

1、使用Shell/Users/nisj/PycharmProjects/BiDataProc/getOssFileForDemo/getHdfsFilePath.sh#!/usr/bin/env b

圖的廣度深度

初始化 -- fin num 方法 技術分享 else 全部 nts /* 圖的遍歷方法主要有兩種:一種是深度優先遍歷。一種是廣度優先遍歷。圖的深度優先遍歷類同於樹的先根遍歷。圖的廣度遍歷類同樹的層次遍歷 一:連通圖的深度優先遍歷算法 圖的深度優先遍歷算法是遍歷

數據結構-深度廣度(轉)

指針 void 邊表 當前 初始化 循環隊列 logs == ont 本文轉自http://blog.csdn.net/wingofeagle/article/details/13020373 深度遍歷: 從圖中某個頂點v出發,訪問此頂點,然後從v的未被訪問的鄰接點出發

[Leetcode] Construct binary tree from inorder and postorder travesal 利用中序後續構造二叉樹

post right clas end opened tree 數組 isp solution Given inorder and postorder traversal of a tree, construct the binary tree. Note: You ma

Java文件操作(新建,,刪除)

div oid stack blog ace bytes except stat exception //創建文件 private static void createFile(File file){ try { if(!file.exists()

foreachmap

修改 fun .html htm 自己 bsp 原來 console fine 參考網址:http://www.cnblogs.com/jocyci/p/5508279.html 1.foreach : 理論上這個方法是沒有返回值的,僅僅是遍歷數組中的每一項,不對原來數組

03鄰接矩陣的深度廣度的C語言實現

返回 算法 ++ 其它 連通圖 edge main fin site #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define

原生JS forEach()map(),jQuery$.each()$.map()

each ole this asc fin name param view map() 一、原生JS forEach()和map()遍歷 共同點: 1.都是循環遍歷數組中的每一項。 2.forEach() 和 map() 裏面每一次執行匿名函數都支持3個參數:數組中的當前項

算法學習筆記(六) 二叉樹—深搜 DFS 與廣搜 BFS

創建 mark preorder 第一個 高度 變量初始化 term link 文章 圖的深搜與廣搜 復習下二叉樹、圖的深搜與廣搜。從圖的遍歷說起。圖的遍歷方法有兩種:深度優先遍歷(Depth First Search),

for in、forEnumerateObjectsUsingBlock的區別

value cts mut 很多 普通 使用 keys bsp 枚舉 1.對於集合中對象數很多的情況下,for in 的遍歷速度非常之快,但小規模的遍歷並不明顯(還沒普通for循環快) 2. 如果在for in 循環裏,對這個數組進行了修改的話,無論是增,刪,修改數組

UVa 122 Trees on the level(鏈式二叉樹的建立層次

構建 void target .net color 鏈接 struct failed div 題目鏈接: https://cn.vjudge.net/problem/UVA-122 1 /* 2 問題 3 給出每個節點的權值和路線,輸出該二叉樹的層次遍歷序列。

迷宮的自動生成深度

pan ron float Go == str false 代碼上傳 wid 這個程序是本人在github上看到的,通過對代碼的解析學到了很多知識 在這裏感謝原作者,原作者的文章https://zhuanlan.zhihu.com/p/37061369 關於迷宮的生成: 迷