当前位置: 首页 > news >正文

基于 ElasticSearch 搜索服务的简易 API 调用

Search项目是基于ElasticSearch搜索服务提供的简易API调用,支持以下功能

数据索引

  • 添加索引数据
  • 更新索引数据(UpdateById/UpdateByQuery)
  • 数据批量操作(批量添加/删除/修改)
  • 路由(routing)
  • 建议查询(Suggest)
  • Mustache模板查询
  • 索引数据删除(DeleteById/DeleteByQuery/DeleteByType)

检索功能

检索功能,支持基本逻辑查询:

  1. “& | ! ” 查询
  2. “ 嵌套 & | ! ”查询
  3. EQL查询(自定义SQL)
  4. 聚合查询方式

每个简单数据类型查询单元支持

  1. {term:中国西域} --- 精确查询
  2. {match:中国西域} --- 匹配(支持分词)
  3. {prefix:中国西域} --- 前缀
  4. {wildcard:W?F*HW} --- 通配符
  5. {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 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调用 ValuePackage ValueEntity

本文来自云栖社区合作伙伴“开源中国”

本文作者:王练

原文链接

相关文章:

  • SCCM 2016 使用PXE 部署操作系统(五)
  • Java如何获取系统cpu、内存、硬盘信息
  • squid缓存代理---传统代理和透明代理详解
  • JS对象和Jquery对象的转换
  • 一道面试题引发的“血案”
  • 个人电脑重装WINDOWN XP 论坛
  • 14 CSS题目附答案
  • 单因素协方差分析
  • 判断某个字符串中是否存在某些字符
  • 阿里云ChatOps实战
  • 一步一步SharePoint 2007之七:改变导航栏中项目的标题和内容
  • 云端一体化差分+安全升级,AliOS Things物联网升级“利器”
  • Pywinauto自动化操作PC微信提取好友微信号
  • BAT都有哪些AIOps的经典案例?
  • 如何查看当前Open的Cursor
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • angular组件开发
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • ES6语法详解(一)
  • JDK9: 集成 Jshell 和 Maven 项目.
  • React Transition Group -- Transition 组件
  • React-Native - 收藏集 - 掘金
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 基于组件的设计工作流与界面抽象
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 理清楚Vue的结构
  • 浏览器缓存机制分析
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端面试之闭包
  • 硬币翻转问题,区间操作
  • 运行时添加log4j2的appender
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 7行Python代码的人脸识别
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (007)XHTML文档之标题——h1~h6
  • (1)虚拟机的安装与使用,linux系统安装
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十一)c52学习之旅-动态数码管
  • ***利用Ms05002溢出找“肉鸡
  • ... 是什么 ?... 有什么用处?
  • .NET 解决重复提交问题
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NetCore项目nginx发布
  • .NET大文件上传知识整理
  • @EventListener注解使用说明
  • @private @protected @public
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [ C++ ] STL---string类的模拟实现