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

简介: Search项目是基于ElasticSearch搜索服务提供的简易API调用,支持以下功能 数据索引 添加索引数据 更新索引数据(UpdateById/UpdateByQuery) 数据批量操作(批量添加/删除/修改) 路由(routing) 建议查询(Suggest) Mustache模板.

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 扩展,增加以数据库为数据源的联想词功能,源码下载

联想词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

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

本文作者:王练

原文链接

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
8月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
9月前
|
机器学习/深度学习 JSON 监控
淘宝拍立淘按图搜索与商品详情API的JSON数据返回详解
通过调用taobao.item.get接口,获取商品标题、价格、销量、SKU、图片、属性、促销信息等全量数据。
|
8月前
|
人工智能 自然语言处理 测试技术
Apipost智能搜索:只需用业务语言描述需求,就能精准定位目标接口,API 搜索的下一代形态!
在大型项目中,API 数量庞大、命名不一,导致“找接口”耗时费力。传统工具依赖关键词搜索,难以应对语义模糊或命名不规范的场景。Apipost AI 智能搜索功能,支持自然语言查询,如“和用户登录有关的接口”,系统可理解语义并精准匹配目标接口。无论是新人上手、模糊查找还是批量定位,都能大幅提升检索效率,降低协作成本。从关键词到语义理解,智能搜索让开发者少花时间找接口,多专注核心开发,真正实现高效协作。
|
8月前
|
存储 API 数据库
按图搜索1688商品的API接口
本文介绍如何利用阿里云ImageSearch服务实现1688商品的按图搜索功能。通过提取图像特征向量并计算相似度,结合Flask搭建API接口,可快速构建基于图片的商品检索系统,提升电商用户体验。
|
8月前
|
JSON API 开发者
1688按关键词搜索商品的API接口技术指南
本文介绍如何使用1688开放平台API实现商品关键词搜索,涵盖API概述、权限申请、调用步骤、Python代码示例及注意事项,助力开发者高效集成商品搜索功能,适用于电商自动化、价格监控等场景,内容基于官方文档,确保准确可靠。
1009 0
|
8月前
|
存储 缓存 算法
亚马逊 SP-API 深度开发:关键字搜索接口的购物意图挖掘与合规竞品分析
本文深度解析亚马逊SP-API关键字搜索接口的合规调用与商业应用,涵盖意图识别、竞品分析、性能优化全链路。通过COSMO算法解析用户购物意图,结合合规技术方案提升关键词转化率,助力卖家实现数据驱动决策,安全高效优化运营。
|
9月前
|
JSON 自然语言处理 监控
淘宝关键词搜索与商品详情API接口(JSON数据返回)
通过商品ID(num_iid)获取商品全量信息,包括SKU规格、库存、促销活动、卖家信息、详情页HTML等。
|
9月前
|
机器学习/深度学习 JSON API
干货,淘宝拍立淘按图搜索,淘宝API(json数据返回)
淘宝拍立淘按图搜索API接口基于深度学习与计算机视觉技术,通过解析用户上传的商品图片,在淘宝商品库中实现毫秒级相似商品匹配,并以JSON格式返回商品标题、图片链接、价格、销量、相似度评分等详细信息。
|
9月前
|
JSON 算法 API
京东:利用商品管理API自动调整商品上下架状态,优化搜索排名
京东通过商品管理API实现商品状态自动调整,优化搜索排名。本文详解API功能、实现方法、排名优化原理,并提供Python代码示例,助力商家提升运营效率与曝光度。

热门文章

最新文章