博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch支持类似与sql语句的查询表达式
阅读量:5861 次
发布时间:2019-06-19

本文共 4069 字,大约阅读时间需要 13 分钟。

  1. 写在之前
    ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
    在之前在项目开发中的不同的查询条件都需要单独些Java bean去封装查询语句,后面就想能不能让es也支持类似与sql where name=xxx and age=20这类的过滤条件。所以在这儿就写了个解析表达式同时生成es能够支持的query dsl的小工具 支持的操作符号有==,!= ,<,>,>=,<= 同时还支持加括号增加查询条件优先级的功能。
  2. 实现

    源码中的conditionNode用到了二叉树的结构,表达不是很清楚,直接上个列子吧,比如我要查询的表达式为:

    name==yang and age==20

    生成的conditionNode 的json结构为

    {"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的左右两个节点封装单独的两个conditionNode ,且其关系为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  }}

    如果只是支持顺序解析倒也没有什么特别的,这里举个添加括号提高查询条件优先级的列子:

    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"}

    最后根据该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  }}
冗余的东西有点多,大家将就着看吧,这里贴上源码地址

转载地址:http://nkgjx.baihongyu.com/

你可能感兴趣的文章
Oracle 12c dataguard云上挖坑记--为某机场贵宾业务部署oracle 12c到云端
查看>>
Elasticsearch Index API & Aggregations API & Query DSL
查看>>
腾讯(成都)创新设计思维_ BY 高煥堂
查看>>
ospf v3 及WIN XP ipv6
查看>>
SQL Server 安装
查看>>
老生常谈一下在AD中细粒度设置密码策略
查看>>
大侠唐在飞:WIN8试用记
查看>>
MongoDB介绍
查看>>
【ZooKeeper Notes 13】ZooKeeper Watcher的事件通知类型
查看>>
WPF-003 popup实现下拉列表的问题
查看>>
WEB应用的安全的登录认证
查看>>
Apache的httpd-2.4.23 Server源文件安装
查看>>
VR+醫療MRI
查看>>
《统一沟通-微软-技巧》-19-Lync 2010如何使用智能手机中联系人
查看>>
SCCM2012SP1---分发部署软件
查看>>
活动目录长时间未复制链接丢失解决办法
查看>>
19.Azure备份Azure上的虚拟机(上)
查看>>
自定义javascript调试输出函数
查看>>
云计算让教学随需应变
查看>>
linux下用tar进行数据备份
查看>>