成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

elasticsearch支持類似與sql語句的查詢表達(dá)式

番茄西紅柿 / 2126人閱讀

摘要:是用開發(fā)的,并作為許可條款下的開放源碼發(fā)布,是當(dāng)前流行的企業(yè)級(jí)搜索引擎。在之前在項(xiàng)目開發(fā)中的不同的查詢條件都需要多帶帶些去封裝查詢語句,后面就想能不能讓也支持類似與這類的過濾條件。

寫在之前
ElasticSearch是一個(gè)基于Lucene的搜索服務(wù)器。它提供了一個(gè)分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是當(dāng)前流行的企業(yè)級(jí)搜索引擎。設(shè)計(jì)用于云計(jì)算中,能夠達(dá)到實(shí)時(shí)搜索,穩(wěn)定,可靠,快速,安裝使用方便。
在之前在項(xiàng)目開發(fā)中的不同的查詢條件都需要多帶帶些Java bean去封裝查詢語句,后面就想能不能讓es也支持類似與sql where name=xxx and age=20這類的過濾條件。所以在這兒就寫了個(gè)解析表達(dá)式同時(shí)生成es能夠支持的query dsl的小工具 支持的操作符號(hào)有==,!= ,<,>,>=,<= 同時(shí)還支持加括號(hào)增加查詢條件優(yōu)先級(jí)的功能。

實(shí)現(xiàn)
源碼中的conditionNode用到了二叉樹的結(jié)構(gòu),表達(dá)不是很清楚,直接上個(gè)列子吧,比如我要查詢的表達(dá)式為:

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的左右兩個(gè)節(jié)點(diǎn)封裝多帶帶的兩個(gè)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
  }
}

如果只是支持順序解析倒也沒有什么特別的,這里舉個(gè)添加括號(hào)提高查詢條件優(yōu)先級(jí)的列子:
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
  }
}

    冗余的東西有點(diǎn)多,大家將就著看吧,這里貼上源碼地址

https://github.com/jacobyangs...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70509.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<