摘要:是用開發(fā)的,并作為許可條款下的開放源碼發(fā)布,是當前流行的企業(yè)級搜索引擎。在之前在項目開發(fā)中的不同的查詢條件都需要多帶帶些去封裝查詢語句,后面就想能不能讓也支持類似與這類的過濾條件。
寫在之前
ElasticSearch是一個基于Lucene的搜索服務(wù)器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是當前流行的企業(yè)級搜索引擎。設(shè)計用于云計算中,能夠達到實時搜索,穩(wěn)定,可靠,快速,安裝使用方便。
在之前在項目開發(fā)中的不同的查詢條件都需要多帶帶些Java bean去封裝查詢語句,后面就想能不能讓es也支持類似與sql where name=xxx and age=20這類的過濾條件。所以在這兒就寫了個解析表達式同時生成es能夠支持的query dsl的小工具 支持的操作符號有==,!= ,<,>,>=,<= 同時還支持加括號增加查詢條件優(yōu)先級的功能。
實現(xiàn)
源碼中的conditionNode用到了二叉樹的結(jié)構(gòu),表達不是很清楚,直接上個列子吧,比如我要查詢的表達式為:
name==yang and age==20
生成的conditionNode 的json結(jié)構(gòu)為
{ "op":"eq", "type":"normal", "left":{ "field":"name", "value":"yang", "op":"eq", "type":"normal" }, "right":{ "field":"age", "value":"20", "op":"eq", "type":"normal" }, "relation":"and" }
可以看到在最外層的conditionNode的左右兩個節(jié)點封裝多帶帶的兩個conditionNode ,且其關(guān)系為and,最后將 解析后的condition生成query dsl:
{ "bool" : { "must" : [ { "bool" : { "must" : [ { "query_string" : { "query" : "name:"yang"" } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }, { "bool" : { "must" : [ { "query_string" : { "query" : "age:"20"", } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }
如果只是支持順序解析倒也沒有什么特別的,這里舉個添加括號提高查詢條件優(yōu)先級的列子:
expression : (name==yang and age>20) or (name == wang and age<=18)
解析后的conditionNode為:
{ "op":"eq", "type":"normal", "left":{ "op":"eq", "type":"normal", "left":{ "field":"name", "value":"yang", "op":"eq", "type":"normal" }, "right":{ "field":"age", "value":"20", "op":"gte", "type":"normal" }, "relation":"and" }, "right":{ "op":"eq", "type":"normal", "left":{ "field":"name", "value":"wang", "op":"eq", "type":"normal" }, "right":{ "field":"age", "value":"18", "op":"lte", "type":"normal" }, "relation":"and" }, "relation":"or" }
最后根據(jù)該conditionNode生成的dsl語句為:
{ "bool" : { "should" : [ { "bool" : { "must" : [ { "bool" : { "must" : [ { "query_string" : { "query" : "name:"wang"" } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }, { "bool" : { "must" : [ { "range" : { "age" : { "from" : null, "to" : "18", "include_lower" : true, "include_upper" : true, "boost" : 1.0 } } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }, { "bool" : { "must" : [ { "bool" : { "must" : [ { "query_string" : { "query" : "name:"yang"" } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }, { "bool" : { "must" : [ { "range" : { "age" : { "from" : "20", "to" : null, "include_lower" : false, "include_upper" : true, "boost" : 1.0 } } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }
冗余的東西有點多,大家將就著看吧,這里貼上源碼地址
https://github.com/jacobyangs...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70509.html
閱讀 730·2023-04-25 19:43
閱讀 3974·2021-11-30 14:52
閱讀 3801·2021-11-30 14:52
閱讀 3865·2021-11-29 11:00
閱讀 3796·2021-11-29 11:00
閱讀 3894·2021-11-29 11:00
閱讀 3571·2021-11-29 11:00
閱讀 6154·2021-11-29 11:00