基于 ElasticSearch 搜索服务的简易 API 调用
Search项目是基于ElasticSearch搜索服务提供的简易API调用,支持以下功能
数据索引
- 添加索引数据
- 更新索引数据(UpdateById/UpdateByQuery)
- 数据批量操作(批量添加/删除/修改)
- 路由(routing)
- 建议查询(Suggest)
- Mustache模板查询
- 索引数据删除(DeleteById/DeleteByQuery/DeleteByType)
检索功能
检索功能,支持基本逻辑查询:
- “& | ! ” 查询
- “ 嵌套 & | ! ”查询
- EQL查询(自定义SQL)
- 聚合查询方式
每个简单数据类型查询单元支持
- {term:中国西域} --- 精确查询
- {match:中国西域} --- 匹配(支持分词)
- {prefix:中国西域} --- 前缀
- {wildcard:W?F*HW} --- 通配符
- {regexp:W[0-9].+} --- 正则
类SQL查询规则
概念:
搜索单元
- 概念:用于搜索的“一个”逻辑单元,小括号括起,并且每个括号是一个field的比较
- 书写形式:(field:value)
- Note:(a:1)、(1<a<10) 、(a>5&a<10) 都是单个field的比较
值函数
- 概念:函数解析使用{}括起(未使用函数解析的均认为是term解析查询)
- 书写形式:{term:中国西域}
- 函数穷举:
- {term:中国西域} ——词条查询
- {match:中国西域} ——匹配(支持分词)
- {prefix:中国西域} ——前缀
- {wildcard:W?F*HW} ——通配符
- {regexp:W[0-9].+} ——正则
- Node:(supplierName:{wildcard:北京商贸*}) 查询已北京商贸开头的相关信息
范围查询
- 概念:范围查询针对集合区间在后台处理做了抽象,支持任意的开闭原则及范围区间查询 支持基本数据类型范围查询及日期类型范围查询
- 书写形式:(value1<field<=value2)、(field<v2)、(field<v2)
- Node:
- 闭区间查询保证字段在值的中间如: v1<field<v2
- 开区间查询保证字段在值的左边如: field>v1 或者 field<v2
- 日期范围查询日期格式为 “yyyy-MM-dd HH:mm:ss”
取反查询运算
- 概念:满足条件的反向,只能用于查询语句的前面 用!表示
- 书写形式: !(a<=10) 、!(&(a:1|2|3)&(b:zhangsan))
- Node: !(a<10) = (a>=10)
逻辑运算符
- 概念: 用于单元中与 或 的逻辑运算,用& | 表示
- 书写形式: !(a<=10) 、!(&(a:1|2|3)&(b:zhangsan))
- Node: !(a<10) = (a>=10)
搜索案例:
- 精确查找:(supplierId:2241527253818753)
- 单字段或查询:
- (cityId:1|18|241)
- !(cityId:1|18|241)
- 简单范围查询:
- (goodsStorage>100000000)
- (goodsStorage<=10)
- (goodsStorage<=10|goodsStorage>100000000)
- !(goodsStorage<=10|goodsStorage>100000000)同(10<goodsStorage<=100000000)等价
- 日期范围查询:yyyy-MM-dd HH:mm:ss
- (createTime<2018-05-15 00:00:00)
- (createTime*gt;=2018-05-15 00:00:00)
- !(createTime<=2018-05-15 00:00:00)
- (createTime<=2018-05-15 00:00:00|createTime>2018-06-15 00:00:00)
- !(createTime<=2018-05-15 00:00:00|createTime>2018-06-15 00:00:00)与(2018-05-15 00:00:00<createTime<=2018-06-15 00:00:00)等价
- 函数查询:
- (supplierName:{prefix:测试}) 前缀
- (supplierName:{wildcard:测试}) 通配符
- (supplierName:{regexp:[^Baker]+测试.*}) 正则
- 组合查询:
- (&(2018-05-15 00:00:00<=createTime<=2018-06-15 00:00:00)&(goodsStorage<1000))
- !(&(2018-05-15 00:00:00<=createTime<=2018-06-15 00:00:00)&(goodsStorage<1000))
- (&(2018-05-15 00:00:00<=createTime<=2018-06-15 00:00:00)&(goodsStorage<1000)&(supplierId:2241527253818753))
- !(supplierName:{regexp:[^Baker]+测试.*})
- (&(supplierName:{regexp:[^Baker]+测试.*})&!(5<goodsNum<25))
- &!(&(supplierName:{regexp:[^Baker]+测试.*})&!(5<goodsNum<25))
EQL数据组织
String eql = "|(attrIds:2232012366099328|189)|(attrIds:2292774003989889|2300097498406272)"; BoolPager boolPager = EqlToPagerConverterUtils.convertToPager(eql); boolPager.setPageNo(pageNo); boolPager.setPageSize(pageSize); boolPager.set_index(dto.getIndexName().trim()); boolPager.set_type(dto.getIndexType().trim()); if(StringUtils.isNotBlank(dto.getSortName())) { if("desc".equals(dto.getSortOrder())){ sortField.put(dto.getSortName().trim(), SearchFactor.DESC); }else { sortField.put(dto.getSortName().trim(), SearchFactor.ASC); } boolPager.setSortFields(sortField); } BoolPager resultPager = BaseSearch.boolQuery(transportClient, boolPager); System.out.println(resultPager.getResult());
搜索平台
分词功能
检索功能
聚合........
插件功能
IK分词器进行二次开发,支持数据库扫描热词、停止词功能。 添加ElasticSearch TokenFilter 扩展,增加以数据库为数据源的联想词功能,源码下载
- elasticsearch-analysis-ik IK分词器配置使用方式不变,内部自动集成MySQL热词数据源
联想词ik_synonym功能扩展
curl -XPUT http://XXX.XXX.XXX.XXX:9200/g_i -d ' { "settings":{ "refresh_interval":"1s", "number_of_replicas":1, "number_of_shards":1, "analysis":{ "filter":{ "by_tfr":{ "type":"stop", "stopwords":[" "] }, "by_sfr":{ "type":"ik_synonym", "ignore_case":true, "expand":true } }, "analyzer":{ "by_smart":{ "type":"custom", "char_filter": [ "html_strip" ], "tokenizer":"ik_smart", "filter":[ "by_sfr" ] }, "by_max_word":{ "type":"custom", "char_filter": [ "html_strip" ], "tokenizer":"standard", "filter":[ "by_sfr" ] } } } }, "mappings":{ "g_t": { "properties": { "goodsName": { "type": "text", "analyzer": "by_smart" } } } } }'
聚合功能
自定义Spring标签
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:search="http://www.fast-search.com/schema/search" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.fast-search.com/schema/search http://www.fast-search.com/schema/search/search-1.1.xsd"> <search:client id="esConnect"> <search:cluster-servers cluster-name="elasticsearch" ping-timeout="10s" ignore-cluster-name="true" cluster-sniff="true"> <search:node-address value="XXX.XXX.XXX.XXX:9300"/> <search:node-address value="XXX.XXX.XXX.XXX:9300"/> <search:node-address value="XXX.XXX.XXX.XXX:9300"/> <search:node-address value="XXX.XXX.XXX.XXX:9300"/> </search:cluster-servers> </search:client> </beans>
查询数据组织(统一入口)
针对查询采用统一的查询入口进行数据组织
组织形式
BoolPager boolPager = new BoolPager(); boolPager.setPageNo(pageNo); boolPager.setPageSize(pageSize); List<ValuePackage> vps = new ArrayList<>(); List<ValueEntity> vs = new ArrayList<>(); vs.add(new ValueEntity.Builder("categoryId",new Object[]{categoryId.toString()}).setNot().build()); vs.add(new ValueEntity.Builder("supplierName",new Object[]{"*"+supplierName+"*"}).rule(SearchType.WILDCARD_QUERY).build()); vs.add(new ValueEntity.Builder("orderStatus",new Object[]{1}).build());//接单状态 1正常接单 vs.add(new ValueEntity.Builder("isDel",new Object[]{0}).build());//供应商状态 1正常 2暂停接单 if(isSpecial != null && isSpecial == 1){//自营订单传 1 限制可接自营供应商才可接该单 进行限制 vs.add(new ValueEntity.Builder("isSpecial",new Object[]{isSpecial}).build());//供应商状态 1正常 2暂停接单 } if(isTest != null){//自营订单传 1 限制可接自营供应商才可接该单 进行限制 vs.add(new ValueEntity.Builder("isTest",new Object[]{isTest}).build()); } ValuePackage vp = new ValuePackage(); vp.setEntitys(vs); vps.add(vp); boolPager.setQuery(vps); boolPager.set_index(IndexConf.supplierIndex); boolPager.set_type(IndexConf.categoryType); boolPager.setFields(new String[]{"supplierId","supplierName"});//获取供应商id和供应商名称 boolPager = BaseSearch.boolQuery(client,boolPager);
ValuePackage类似于一个查询实体包 ,是包装了多个查询逻辑单元组合的查询集合,如果对ElasticSearch Restful调用
本文来自云栖社区合作伙伴“开源中国”
本文作者:王练
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开源大数据周刊-第101期
资讯 微软、SAP和Adobe“结盟”提出开放数据计划很多企业无法更好地研究自己客户的用户行为,这是因为重要的客户信息都被中介和第三方服务商所掌控,被困在很多信息孤岛之中,这限制了这些企业从中获取更有价值的用户行为信息。 手握 5G + AI 两张王牌的高通,将如何实现无线边缘的拓展?智能手机的巨大规模,加上移动技术对物联网的赋能,毫无疑问会将人工智能带至数万亿联网终端;5G 技术将与人工智能并行发展,创造出下一个移动革命。从某种意义上来说,凭借 AI + 5G 的重大发展优势,高通在这场即将到来的引领消费者进入全新移动革命中,扮演的正是领导者的角色。 国内外大数据标准化现状及发展方向当前,各种大数据存产品和面向各行业的大数据应用层出不穷,急需通过标准化的途径规范认知,整合资源,促进各方达成共识,为我国大数据产业的健康发展打下基础,为数
- 下一篇
阿里关涛谈大规模计算—从数字化阿里到数字化城市的进化
在刚刚结束的2018杭州云栖大会上,阿里巴巴通用计算平台负责人,阿里巴巴计算平台资深技术专家关涛从计算力,联合计算,智能化,企业级服务能力四个方面详细介绍阿里巴巴统一的超大规模数据计算平台MaxCompute的探索与实践。从数字化阿里巴巴,到数字化企业,再到数字化城市,MaxCompute快速进化,加速科技普惠, 驱动数字中国。 关涛现场演讲视频回放>>> 飞天2.0 MaxCompute是阿里巴巴在9年前做飞天系统的三大件之分布式计算部分。9年后的今天,MaxCompute已经是可以承载EB级的数据存储能力,百PB级的单日计算能力,公共云覆盖国内外十几个国家和地区,专有云包含城市大脑在内部署超过100+套的阿里巴巴的统一计算平台。 阿里巴巴集团副总裁周靖人在本次云栖大会接受采访时称,阿里巴巴从2008年就开始做大数据
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS关闭SELinux安全模块
- CentOS6,7,8上安装Nginx,支持https2.0的开启