本章主要介绍DQL的搜索试验。
查询数据时除了使用DQL查询,还可以使用搜索试验。使用搜索试验时,搜索语句贴近自然语言,只需要输入搜索语句或者关键词,就能查询到想要的数据。
如上图所示,用户想要查看Employee表的数据。那怎样能让业务人员无需了解数据库表结构,只要在界面上输入自然查询语句就可以随意查询数据呢?往下看。
步骤一:
新建词典文件。
打开元数据编辑设计器,在菜单栏中点击文件 - 新建。
创建词典文件。
在菜单栏中点击工具 - 导入元数据,选择元数据文件。
确定后,生成词典。词典内容如下:
l 数据结构tab:
如上图量纲部分,新建词典时,程序会初始化一些量纲、量词,用户可根据需要进行增删改。
如上图表部分,可对表、表中的宏字段以及字段簇进行增删改。
l 编辑tab:
词典中大部分搜索词都在这里定义。
新建词典时,程序会初始化一些比较词、排序词、聚合词、连词、宏词和无效词,可根据需要进行增删改。
l 列表tab:
词典中全部搜索词都在这里展示,双击任意词可跳转到该词的编辑页面。
步骤二:
为了使搜索更方便,可以给词定义一个或多个方便记忆的名字,比如:
步骤三:
查看Employee表中的员工姓名。
菜单栏中点击工具 - 搜索实验
输入搜索语句:姓名,点击【搜索】按钮:
搜索结果中出现一个或多个结果。选中搜索结果,点击【查看明细】,可查看对应的DQL语句。
点击【执行DQL】,查看搜索结果。
默认最多显示100条数据,此值可被修改,修改后点击【执行DQL】刷新数据。
为了帮助用户更好的理解各种搜索语句,[集算器安装路径]\esProc\esproc-services\datalogic\conf下提供了词典文件demo.glxc。下面我们通过demo.glxc来演示多种搜索语句的使用和设计。
Ø 表词
搜索语句:雇员
DQL:
select Employee.EmpID as EmpID,Employee.Name as Name,Employee.Title as Title,Employee.BirthDate as BirthDate,Employee.HireDate as HireDate,Employee.Boss as Boss,Employee.HomeCity as HomeCity,year(now())-year(Employee.BirthDate) as Employee_age from Employee
浏览数据:
Ø 字段词
例1:
搜索语句:雇员姓名
DQL:
select Employee.Name as 姓名 from Employee
浏览数据:
例2:
增加自定义字段,并为自定义字段添加字段词:
搜索语句:年龄大于40岁的雇员
DQL:
select Employee.EmpID as EmpID,Employee.Name as Name,Employee.Title as Title,Employee.BirthDate as BirthDate,Employee.HireDate as HireDate,Employee.Boss as Boss,Employee.HomeCity as HomeCity,year(now())-year(Employee.BirthDate) as Employee_age from Employee where (year(now())-year(Employee.BirthDate)>40)
浏览数据:
需要说明的是,例子中对年龄的计算只是一种简化算法,如果需要精确的年龄,则需要比较日期。
例3:
使用外键字段,并为外键字段添加字段词:
搜索语句:订单ID签单销售
DQL:
select Orders.OrderID as 订单ID,Orders.EmployeeID.Name as 签单销售 from Orders
浏览数据:
Ø 维词
例1:
搜索语句:今年Sanchuan订单金额
DQL:
select Orders.ShipDate#Year as ShipDate,Orders.CustomerID as CustomerID,Orders.Amount as 订单金额 from Orders where (Orders.ShipDate#Year==year(now()))&&(Orders.CustomerID==\"ALFKI\")
浏览数据:
例2:
搜索语句:北方地区的雇员姓名
DQL:
select Employee.HomeCity#Area as HomeCity,Employee.Name as 姓名 from Employee where ([1,3,5].contain(Employee.HomeCity#Area))
浏览数据:
Ø 比较词
例1:
搜索语句:订单金额大于1000
DQL:
select Orders.OrderID as OrderID,Orders.CustomerID as CustomerID,Orders.EmployeeID as EmployeeID,Orders.ReceiveDate as ReceiveDate,Orders.ShipDate as ShipDate,Orders.Amount as Amount,Orders.EmployeeID.Name as Orders_EmployeeID_Name from Orders where (Orders.Amount>1000)
浏览数据:
例2:
搜索语句:发货日期早于2011-02-12
DQL:
select Orders.OrderID as OrderID,Orders.CustomerID as CustomerID,Orders.EmployeeID as EmployeeID,Orders.ReceiveDate as ReceiveDate,Orders.ShipDate as ShipDate,Orders.Amount as Amount,Orders.EmployeeID.Name as Orders_EmployeeID_Name from Orders where (Orders.ShipDate<date(2011,02,12) )
浏览数据:
Ø 排序词
例1:
搜索语句:订单金额降序
DQL:
select Orders.Amount as 订单金额 from Orders order by 订单金额 desc
浏览数据:
例2:
搜索语句:订单金额前5
DQL:
select Orders.Amount as 订单金额 from Orders order by 订单金额 desc limit 5
浏览数据:
Ø 动词
搜索语句:生于1978年
搜索时,程序会去Employee_cluster1字段簇里找与1978年数据类型匹配的日期型宏字段Employee.BirthDate,再过滤出1978年的数据。
DQL:
select Employee.EmpID as EmpID,Employee.Name as Name,Employee.Title as Title,Employee.BirthDate as BirthDate,Employee.HireDate as HireDate,Employee.Boss as Boss,Employee.HomeCity as HomeCity,year(now())-year(Employee.BirthDate) as Employee_age from Employee where (Employee.BirthDate#Year==1978)
浏览数据:
Ø 聚合词
例1:
搜索语句:订单金额总计
DQL:
select Orders.sum(Orders.Amount) as 订单金额总计 from Orders
浏览数据:
例2:
搜索语句:客户订单金额总计
DQL:
select Orders.sum(Orders.Amount) as 订单金额总计 on Customer as 客户 from Orders by Orders.CustomerID
浏览数据:
Ø 连词
搜索语句:订单金额小于200或者订单金额大于10000
DQL:
select Orders.OrderID as OrderID,Orders.CustomerID as CustomerID,Orders.EmployeeID as EmployeeID,Orders.ReceiveDate as ReceiveDate,Orders.ShipDate as ShipDate,Orders.Amount as Amount,Orders.EmployeeID.Name as Orders_EmployeeID_Name from Orders where ((Orders.Amount<200) || (Orders.Amount>10000))
浏览数据:
Ø 宏词
搜索语句:最年轻的员工
DQL:
select top 1 Employee.EmpID as EmpID,Employee.Name as Name,Employee.Title as Title,Employee.BirthDate as BirthDate,Employee.HireDate as HireDate,Employee.Boss as Boss,Employee.HomeCity as HomeCity,year(now())-year(Employee.BirthDate) as Employee_age from Employee order by year(now())-year(Employee.BirthDate) asc
浏览数据:
Ø 量词
例1:
搜索语句:金额大于1000元
DQL:
select ReturnedPmt.CustomerID as CustomerID,ReturnedPmt.ID as ID,ReturnedPmt.SellerID as SellerID,ReturnedPmt.Date as Date,ReturnedPmt.Amount as Amount,ReturnedPmt.VIPCustomer_End as VIPCustomer_End from ReturnedPmt where (ReturnedPmt.Amount>1000)
浏览数据:
搜索语句:金额大于1千元
DQL:
select ReturnedPmt.CustomerID as CustomerID,ReturnedPmt.ID as ID,ReturnedPmt.SellerID as SellerID,ReturnedPmt.Date as Date,ReturnedPmt.Amount as Amount,ReturnedPmt.VIPCustomer_End as VIPCustomer_End from ReturnedPmt where (ReturnedPmt.Amount>1*1000.0)
浏览数据:同上
例2:
搜索语句:40岁以上姓名
DQL:
select year(now())-year(Employee.BirthDate) as Employee_age,Employee.Name as 姓名 from Employee where (year(now())-year(Employee.BirthDate)>40)
浏览数据:
Ø 无效词
搜索语句:40岁以上的姓名
DQL:
select year(now())-year(Employee.BirthDate) as Employee_age,Employee.Name as 姓名 from Employee where (year(now())-year(Employee.BirthDate)>40)
浏览数据:同上
各种词的定义和更详细的介绍,参考词典文件设计小节。