1. 程式人生 > >最近工作中遇到ElasticSearch一些問題總結

最近工作中遇到ElasticSearch一些問題總結

最近在使用ElasticSearch來查詢我們的一些實時資料,中間也遇到不少的問題,今天在此簡單總結記錄一下。es的功能的確十分強大,大部分資料庫能實現的需求,基本在es裡面都能實現,當然兩者都有一些特殊的功能,是雙方不能實現或者不容易實現的。

案例一:

es單個欄位分組後,分頁是個小坑,因為分組結果裡面,只提供了size來限制返回,並沒有類似offset和limit的引數來支援分頁,所以這個地方,一般提供的是top N的分組資料,如果想分頁,只能自己在記憶體中實現。

案例二:

如下面的sql:

select a, b , count(*) as c form t1 group a, b
order by c desc

在es多個欄位分組後,排序都是組內有序,而不是整體資料有序,如果想實現整體資料有序,有兩種解決辦法可以解決:

方法一:

使用agg-script,使用script來實現聚合,這樣唯一的缺點就是大資料量下,耗時比較高。

//多欄位分組
TermsBuilder one = AggregationBuilders.terms("one").script(new Script("doc['stid'].value +'#' + doc['qid'].value"));

方法二:

使用copy欄位,將多維欄位,提供合併成一個欄位,這樣分組時候就可以直接使用這個欄位進行分組,效率較高,但靈活性比較低,如果要是有7,8個欄位都需要兩兩組合分組,那麼索引裡面的冗餘欄位就會多出好多個,索引體積的增大也會影響檢索和聚合效能。

{
  "mappings": {
    "test": {
      "properties": {
        "f": {
          "type": "string",
          "index": "not_analyzed",
          "copy_to": "f_and_g"
        },
        "g": {
          "type": "string",
          "index": "not_analyzed",
          "copy_to": "f_and_g"
        },
        "f_and_g
": { "type": "string", "index": "not_analyzed" } }
}
}
}

當然上面的分組能處理,但是分頁問題依然和案例一是一樣的情況,所有的分組都有這個問題。

案例三:

如下面的sql:

select max(tt.su1),max(tt.su2) 
FROM 
(
select name ,sum(c1) as su1 ,sum(c2) as su2 from tp group by name
) as tt

上面這個sql,是分組某個欄位後,對其中幾個指標進行sum,完事之後,在外層又要取到sum後的某個指標的最大值,這個問題在1.x的es中是不能解決的,但是在2.x之後,es提供了管道聚合,其功能更加強大,類似實現資料裡面的多個子查詢的功能。

下面我們看看如何使用es來完成上面的這個功能:

java程式碼如下:

//構建查詢請求體
        SearchRequestBuilder search = client.prepareSearch("spark").setTypes("spark");

        //分組欄位是id,排序由多個欄位排序組成
        TermsBuilder tb= AggregationBuilders.terms("name").field("name");

        //新增兩個sum指標
        tb.subAggregation(AggregationBuilders.sum("c1").field("c1"));
        tb.subAggregation(AggregationBuilders.sum("c2").field("c2"));

        //新增管道聚合獲取max值
        MaxBucketBuilder maxx=  PipelineAggregatorBuilders.maxBucket("max").setBucketsPaths("name>c1");
        MaxBucketBuilder maxx2=  PipelineAggregatorBuilders.maxBucket("max2").setBucketsPaths("name>c2");



        //封裝聚合實體
        search.addAggregation(maxx);
        search.addAggregation(maxx2);
        search.addAggregation(tb);

        //獲取指標裡面的最大值
        InternalBucketMetricValue imb=search.get().getAggregations().get("max") ;
        InternalBucketMetricValue imb2=search.get().getAggregations().get("max2") ;

        //輸出值的結果
        System.out.println(imb.value());
        System.out.println(imb2.value());



        client.close();

curl如下:

{
  "aggregations" : {
    "max" : {
      "max_bucket" : {
        "buckets_path" : [ "name>c1" ]
      }
    },
    "max2" : {
      "max_bucket" : {
        "buckets_path" : [ "name>c2" ]
      }
    },
    "name" : {
      "terms" : {
        "field" : "name"
      },
      "aggregations" : {
        "c1" : {
          "sum" : {
            "field" : "c1"
          }
        },
        "c2" : {
          "sum" : {
            "field" : "c2"
          }
        }
      }
    }
  }
}

總結:從上面的幾個案例看,es在分組時候的需要考慮的問題要多點,但也大部分都能使用scrpit方式解決,但分組的分頁問題,確實不太好弄,這個地方基本上都是看topN的資料比較方便,如果非要看所有的資料,而且必須分頁,那隻能在記憶體總實現了,所以建議這個地方需要慎重考慮。

有什麼問題可以掃碼關注微信公眾號:我是攻城師(woshigcs),在後臺留言諮詢。 技術債不能欠,健康債更不能欠, 求道之路,與君同行。

輸入圖片說明


相關推薦

最近工作遇到ElasticSearch一些問題總結

最近在使用ElasticSearch來查詢我們的一些實時資料,中間也遇到不少的問題,今天在此簡單總結記錄一下。es的功能的確十分強大,大部分資料庫能實現的需求,基本在es裡面都能實現,當然兩者都有一些特殊的功能,是雙方不能實現或者不容易實現的。 案例一: es單個欄位

工作遇見的一些問題總結

2017-08-07 學習fis3語法. 命令: -d destination 構建釋出到的目標檔案 -r run 執行 -w watch 監視 配置檔案: fis.match(selector, props) 匹配檔案路徑,設定編譯規則屬性 fis.

近期工作遇到的一些問題總結

1.城市列表資料的更新,可以加入版本控制這個概念,每次進入時先比對本地版本號跟伺服器版本號是否一致,不一致去網路進行請求來進行城市資料的更新. 2.解析字典的指令碼,將字典字串拷貝到txt文件,cd到其所在目錄,然後命令列執行:cat readme.txt |

工作碰到的一些問題以及解決方法

post content 獲取json jquery app div ner htm his 一、左中右布局,左邊定寬,中、右百分比的布局: (1)HTML代碼: <div class="three-left"> </div> <d

記錄一下日常工作常用的一些linux指令

1、檢視磁碟總容量:df -h      檢視當前目錄下的磁碟容量:du -sh 2、顯示當前目錄下前n個檔案:ls -1 | sort -u | head -10       檢視檔案前或後n行:head/tail

最近工作生活的一點小總結

最近兩週工作中,感覺明顯狀態不行了,每天做的事情都非常少,效率極低,有可能是年前封閉太累了,封閉完之後,直接過年了,所以狀態包括身體都感覺比較疲憊導致的。並且,最近跟策劃溝通方面也顯得比較毛糙,可能是年齡小了一點,很多東西都沒考慮到,焦躁了一些吧。這毛病得改改了。最近有點心高氣傲,犯了一些低階錯誤,導致效率非

工作遇到的問題總結

1、編譯專案時, 突然丟擲異常 INSTALL_FAILED_INVALID_APK: Split lib_slice_1_apk was defined multiple times。 解決方法:禁用InstantRun 修復該問題 。 ps: Inst

工作遇到的一些小問題的解決方法

前端js判斷身份證號的格式  function sub(){         var card= $("#card").val();         if(card=='' || $.trim(card).length ==0){             $("#se

工作遇到的問題 總結

laravel 修改了 mysql 配置但無效原因: php config 有快取  清除快取解決: php artisan config:clear   清除快取git pull 單檔案/指定檔案git checkout [branch] -- [file name]

Java web 工作遇到的一些問題

1、replaceAll()報錯 public class Biaomi { public static void main(String[] args) { String a = "發大(水廢)"; String b = "發大水(作廢),發大水";

工作遇到的BUG總結1

1.當承保中支和查勘中支都虛擬後,CIBS代查勘案件建立通賠書時,點選提交,頁面顯示:無法顯示該網頁。類似於斷網的狀況。   實際原因是:因為url中要包含承保中支和查勘中支的名稱,導致請求Action的url過長,讓IE7出現報錯。 2.同時開啟新增和修改頁面,新增頁面資

css3在工作運用上的總結(圓角、內陰影、外陰影)

//陰影水平偏移值(可取正負值);陰影垂直偏移值(可取正負值);陰影模糊值;陰影顏色 陰影效果 -moz-box-shadow: 0px 5px 10px rgba(0,0,0,0.2); -webkit-box-shadow: 0px 5px 10px rgba(0,0

C++const的一些總結

1.const常量代替#define巨集定義 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤。(上面這段話出自《高質量C++程式設計指南》) 2.const

vuforia studio 最近工作需要用到他。

ptc 和vuforia 共同開發的這個軟體,主要應用在工業方面,基本上是0程式碼,很好學習  但是有些坑還是挺難得 目前遇到的就是vuforia studio 中匯入模型動畫會沒有   經過2天的研究最後發現 需要是Creo Illustrate 5.0這個版本 而不

關於python字典的一些總結

1、 獲取字典中的值,但是無異常 當在字典中取值的時候,可以使用如下兩種方式: >>> d = {'name':'kel'} >>> d {'name': 'kel'} >>> d['name'] 'kel' >&

運維工作經常用到的一些知識總結(一)

Linux Docker MFS在日常運維工作中,會有一些知識使用頻率較高,以下為個人在工作中常用的一些操作,沒有做詳細的分類,排版比較淩亂。有需要的同學們可以參考,希望能有所幫助。 1、查看當前系統所以變量 sysctl -a 2、修改Centos7 網卡為eth install centos 7 按 ta

運維工作經常用到的一些知識總結(二)

Markdown Xtraback Linux Squid DenyHost 接上篇:http://blog.51cto.com/bobo365/2125121 31、screen: screen -S xxx screen -r xxx screen -D -r <session-id

運維工作經常用到的一些知識總結(四)

Lftp SLA yourls Tomcat多實例 接上篇:http://blog.51cto.com/bobo365/2125159 54、rabbitMQ http://blog.csdn.net/lishaojun0115/article/details/53152255 用戶管理 用戶

運維工作經常用到的一些知識總結(三)

MySQL SLA Nginx tomcat 壓力測試 接上篇:http://blog.51cto.com/bobo365/2125138 48、容器導出導入: docker import 容器ID > xxx.tar cat xxx.tar | docker

最近在ArcGIS Engine開發關於呼叫gp工具過程出現COM 元件的呼叫返回了錯誤 HRESULT E_FAIL 錯誤的解決方法 和 學習oracle遇到的一些問題總結

首先說下AE開發中關於gp這一塊的東西,gp是一個很方便的工具,利用gp可以在程式碼中實現ArcMap工具箱中的大部分內容,關於gp工具的使用我就不說了,這些大部分都可以在網上找到,我要說的是gp使用過程中遇到的問題: 一般gp的報錯為 對 COM 元件的呼叫返回了錯誤 H