摘要:前言這里聲明漫談我們都知道下有的包的,我們也知道下有封裝更好的包。當然這種也是優點,但是如果用了下的的的話,你會會發現對于都封裝的很好。故此,我對下的包進行了增強對進行封裝。這里我的實現也很簡單,其實希望有人能有更好的實現。
前言
這里聲明: elasticsearch -> es
漫談我們都知道Python 下 有es的sdk包的,我們也知道java 下有封裝更好的es包。為什么說python 下的就封裝不好呢? 其實這個也兩說,有人就喜歡這樣呢
Python下的es包首先什么都能做,實現功能完全沒問題。但是對于 DSL 的話,Python下的es就沒有封裝了,完全按照es的語法寫查詢語句。當然這種也是優點,但是如果用了Java下的es 的sdk的話,你會會發現對于DSL 都封裝的很好。
至于封不封裝DSL,其實也看業務復不復雜,簡單的業務,幾行的DSL 直接寫也沒什么,但是如果很長的呢,比如我這樣業務的DSL:
{ "size": 1000, "query": { "bool": { "must": [ { "term": { "prod_code": { "value": "JDB" } } }, { "bool": { "must": [], "must_not": [], "should": [ { "bool": { "must": [], "must_not": [], "should": [ { "query_string": { "default_field": "rp_content", "query": "*下了*" } }, { "query_string": { "default_field": "rp_content", "query": "*下款*" } } ], "filter": [] } }, { "nested": { "path": "rp_data", "query": { "bool": { "must": [], "must_not": [], "should": [ { "query_string": { "default_field": "rp_data.rp_content", "query": "*下了*" } }, { "query_string": { "default_field": "rp_data.rp_content", "query": "*下款*" } } ], "filter": [] } } } } ], "filter": [] } } ] } } }
如果是這樣的DSL 直接寫在代碼中,這個也太長了吧,而且這還不是全部,只是一部分,對于這種動態而且復雜的DSL,直接寫,會顯得太長。
故此,我對Python 下的es包進行了增強 —— 對DSL進行封裝。項目請點擊:# elasticsearch-python
對于上面DSL 的封裝調用結果是這樣的:
prod_code = "JDB" key = "下了" value = "下了 | 下款" bq = bool_query() bq.must(term_query("prod_code", prod_code)) .must(bool_query() .should(multi_query_string("rp_content", value)) .should(nested_query("rp_data", multi_query_string("rp_data.rp_content", value))) ) print(bq) print(QueryBuilders(bq).size(1000))
這下清爽了很多是吧!
當然這個沒寫完,對于聚合還沒寫,而且query也沒全部支持,只是把自己用到的給簡單封裝了下,其實不知道到底有沒有人用,沒人用自己寫再多也就自己玩玩了。這里我的實現也很簡單,其實希望有人能有更好的實現。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41773.html
閱讀 2950·2021-11-23 09:51
閱讀 3776·2021-11-22 15:29
閱讀 3226·2021-10-08 10:05
閱讀 1552·2021-09-22 15:20
閱讀 952·2019-08-30 15:56
閱讀 1069·2019-08-30 15:54
閱讀 733·2019-08-26 11:54
閱讀 2636·2019-08-26 11:32