在這裏,我想向你們推薦一個我本身開發的項目,也就是elasticsearch-query-builder
,這個項目目前在github上已經開源,有興趣的朋友能夠去fork或者star,你的star就是對我最大的鼓勵。同時,本項目長期維護和更新,我也接受而且很高興有小夥伴向本項目pull request,或者協同開發,有興趣的同窗能夠給我發郵件。git
elasticsearch-query-builder
是一個很是方便構造elasticsearch
(後面簡稱ES) DSL 查詢語句的工具包,在elasticsearch-query-builder
中,我嘗試基於配置化的操做去構建ES的查詢語句,而且接受外界傳入參數,這極大的減小了在Java代碼中構建ES查詢語句的工做,並同時減小了代碼量,使代碼更加直觀和清晰。基於使ES中DSL構造語句和Java代碼分離的思想,elasticsearch-query-builder
誕生了。去GithubFork!github
elasticsearch-query-builder
工程通常做爲jar包爲別的工程提供使用,固然,若是須要基於本項目作二次開發,這都須要將Github上克隆本項目到本地數據庫
1 |
git clone https://github.com/xiaowei1118/elasticsearch-query-builder.git |
在將本項目克隆到本地後,執行mvn package
將本項目打成jar包,或者直接將本項目做爲大家本身maven項目的module項目。json
elastcisearch-query-builder接受配置文件(特定json格式)或者json格式的字符串配置,配置格式以下:數組
1 |
{ |
index表示elasticSearch中的索引或者別名。數據結構
type表示elasticSearch索引或者別名下的type。app
from表示檢索文檔時的偏移量,至關於關係型數據庫裏的offset。elasticsearch
include_source 搜索結果中包含某些字段,格式爲json數組,"include_source": ["name","age"]
。maven
exclude_source 搜索結果中排除某些字段,格式爲json數組,"exclude_source":["sex"]
。工具
query_type表示查詢類型,支持三種類型terms_level_query
,text_level_query
,bool_level_query
,而且這三種類型
不能夠一塊兒使用。
terms_level_query
操做的精確字段是存儲在反轉索引中的。這些查詢一般用於結構化數據, 如數字、日期和枚舉, 而不是全文字段,包含term_query,terms_query,range_query,exists_query 等類型。
text_level_query
查詢一般用於在完整文本字段 (如電子郵件正文) 上運行全文查詢。他們瞭解如何分析被查詢的字段, 並在執行以前將每一個字段的分析器 (或 search_analyzer) 應用到查詢字符串。
包含 match_query,multi_match_query,query_string,simple_query_string 等類型。
bool_query
與其餘查詢的布爾組合匹配的文檔匹配的查詢。bool 查詢映射到 Lucene BooleanQuery。它是使用一個或多個布爾子句生成的, 每一個子句都有一個類型化的實例。 布爾查詢的查詢值包括: must,filter,should,must_not. 想要了解這幾個類型的差別,能夠查閱elasticSearch的相關文檔 在每一個布爾查詢的查詢類型值中, 能夠包含terms_level_query 和 text_level_query中任意的查詢類型,如此即可以構造很是複雜的查詢狀況。
terms_level查詢類型,支持term_query
,terms_query
,range_query
,exists_query
查詢。
term_query
1 |
"term_query": { |
terms_query
term_query
。 1 |
"terms_query": { |
range_query
,給定的查詢條件使一個範圍
1 |
"range_query": { |
exists_query
,存在查詢,查找字段不存在的文檔。
1 |
"exists_query": { |
text_level_query查詢類型,支持match_query,multi_match_query,query_string,simple_query_string等。
match_query,普通的文本匹配查詢。
1 |
"match_query": { |
multi_match_query 在多個字段中進行文本匹配
1 |
"multi_match_query": { |
query_string 字符串文本匹配。
1 |
"query_string": { |
and
或者 or
。
1 |
"simple_query_string": { |
bool_query是其餘查詢的布爾組合,通常用於構建複雜的查詢,而這正是elasticsearch-query-builder
最拿手的地方。
1 |
"query_type": "bool_query", |
ES的聚合操做一般用於聚合查詢結果數據,一般用於數據的分類和統計工做。同時ES自己支持多種聚合操做,爲咱們的數據分析和統計提供了便利,相應的,本項目也支持聚合操做的配置化和參數綁定。
1 |
"aggregations": [ |
1 |
{ |
由於aggregation聚合的類型比較多,另外還有,min, max, cardinality,extended_stats, stats,sum,top_hits,value_count,range,missing,date_range,ipv4_range,date_histogram
等,這裏就再也不贅述,須要查看聚合類型怎麼用的,能夠查看配置文件樣例
ES能夠設置對查詢結果中包含搜索關鍵字的字段部分進行高亮。
<em>
</em>
1 |
"highlight":{ |
單值綁定,這裏咱們以sex字段爲例,咱們須要查詢出index中性別爲女性的記錄,咱們能夠用terms查詢,如:
1 |
"term_query": { |
經過以上查詢就能夠查出性別爲女性的文檔。那若是咱們的value值須要從外面傳進來呢,好比咱們的參數在一個json字符串中(很是適合application/json的傳值:)),如:{ "sex": "female",type: 1}
,咱們的配置文件應該怎麼寫?
在elasticsearch-query-builder
中,咱們約定須要外界綁定的參數用${}
將字段包括進來,如:${sex}
這裏的sex
同json數據裏面的key一致。那麼在配置文件中就轉換成了:
1 |
"term_query": { |
若是json中的字段不在第一層呢?比方說:{ "a.sex": "female",type: 1}
, 那麼咱們用.
號來表示層級結構,${a.sex}
, 無論層級多深都沒有問題。
對於範圍類型的參數綁定,好比:type 從 1->6
或者 date 從 2017-06-10 -> 2017-12-12
, 咱們應該怎麼從外界進行參數綁定呢?在range查詢中,咱們已經定義了range的傳參方式,以下:
1 |
"range_query":{ |
其實,其實range的參數綁定和單值的參數綁定是一致的,雖然有範圍,其實取的仍是單值${date}
, 只是咱們對外界的json數據結構表示範圍的字段有限制,咱們規定json中表示範圍的字段必須是[a,b]
的形式,a和b能夠單一缺省,表示無上界或者下界,可是a和b不能夠同時缺省(同時缺省,這個範圍查詢是沒有意義的)。
如json數據:{ "date": "[2017-06-10, 2017-12-12]" }
即符合規範。
這個例子也是elasticsearch-query-builder
種的example。
咱們先定義配置文件test.json
:
1 |
{ |
使用elasticsearch-query-builder
生成ES的查詢語句。
1 |
import com.alibaba.fastjson.JSON; |
生成的ES的DSL查詢語句:
1 |
{ |
本項目並無涵蓋ES的全部查詢功能,同時,也沒有包含ES的最新版本的功能,這些都是我後續須要逐漸完善的地方,我但願能夠經過本身的努力,使本項目愈來愈完善。
本項目使用了阿里的fastjson
jar包,elasticsearch公司的elasticsearch
jar包,以及io.searchbox
的jest
jar包,這裏表示由衷的感謝。