博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于 ElasticSearch 搜索服务的简易 API 调用
阅读量:6507 次
发布时间:2019-06-24

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

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

数据索引


检索功能

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

  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标签

查询数据组织(统一入口)

针对查询采用统一的查询入口进行数据组织

BoolPager

组织形式

BoolPager boolPager = new BoolPager();boolPager.setPageNo(pageNo);boolPager.setPageSize(pageSize);List
vps = new ArrayList<>();List
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

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

本文作者:王练

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

你可能感兴趣的文章
PHP-权限控制类(转)
查看>>
CSS3秘笈第三版涵盖HTML5学习笔记9~12章
查看>>
bzoj1044木棍分割
查看>>
leetcode-136-Single Number
查看>>
微信小程序笔记<五> 页面管理及生命周期(route)——getCurrentPages()
查看>>
http服务器小项目
查看>>
JS案例:Jq中的fadeOut和fadeIn实现简单轮播(没完善,简单实现)
查看>>
一些数学上的名词及操作
查看>>
C# DataGridVie利用model特性动态加载列
查看>>
IPv6 地址分类
查看>>
<%@ include %>指令和<jsp:include>区别
查看>>
因为文件组 'PRIMARY' 已满 解决办法
查看>>
Flume 读取实时更新的日志文件
查看>>
HDU 2049
查看>>
《Spring1之第十次站立会议》
查看>>
Unity Shader 噪声消融特效 - 剑灵死亡特效
查看>>
Eclipse 自动生成 Ant的Build.xml 配置文件
查看>>
添加一条信息到列表,如果重复就替换,
查看>>
C#基础第五天
查看>>
python 小数相加报错 invalid literal for int() with base 10
查看>>