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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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

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

本文作者:王练

原文链接

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
11天前
|
缓存 API 开发者
京东按图搜索商品(拍立淘)API接口系列(京东API)
京东按图搜索商品(拍立淘)API 接口(.jd.item_search_img)通过上传图片搜索京东平台上的相似商品,基于图像识别技术提供便捷的商品搜索方式。适用于电商平台展示、比价等场景。响应参数包括公共参数、商品信息及搜索结果相关参数,方便分页展示和了解整体搜索规模。Python 请求示例展示了如何使用该接口进行图片搜索。
61 15
|
12天前
|
JSON 数据挖掘 API
唯品会按关键字搜索 VIP 商品 API 接口的开发应用与收益
在电商蓬勃发展的今天,精准的商品搜索功能至关重要。唯品会的按关键字搜索VIP商品API接口通过高效、精准的检索,提升了用户购物体验和商家销售业绩。该接口基于RESTful架构,采用JSON格式交互,支持唯品会APP内搜索、第三方平台合作及数据分析等场景,显著提升用户活跃度与忠诚度,拓展销售渠道,增加收入,并挖掘数据驱动的商业价值,助力唯品会持续发展。
25 4
|
22天前
|
监控 搜索推荐 API
京东按图搜索京东商品(拍立淘)API接口的开发、应用与收益
京东通过开放商品详情API接口,尤其是按图搜索(拍立淘)API,为开发者、企业和商家提供了创新空间和数据支持。该API基于图像识别技术,允许用户上传图片搜索相似商品,提升购物体验和平台竞争力。开发流程包括注册账号、获取密钥、准备图片、调用API并解析结果。应用场景涵盖电商平台优化、竞品分析、个性化推荐等,为企业带来显著收益,如增加销售额、提高利润空间和优化用户体验。未来,随着数字化转型的深入,该API的应用前景将更加广阔。
74 1
|
1月前
|
存储 人工智能 API
(Elasticsearch)使用阿里云 infererence API 及 semantic text 进行向量搜索
本文展示了如何使用阿里云 infererence API 及 semantic text 进行向量搜索。
|
1月前
|
机器学习/深度学习 API 数据库
淘宝拍立淘按图搜索商品API接口详解
拍立淘按图搜索商品API接口提供了一种通过上传商品图片来搜索相似或相同商品的功能。用户只需上传一张商品图片,系统通过图像识别技术对该图片进行分析和处理,提取出商品的特征信息,并在商品数据库中进行匹配搜索,最终返回与上传图片相似或相同的商品列表。这一功能广泛应用于电商平台、购物应用以及图像搜索等领域,极大地提升了用户的购物体验。
|
1月前
|
机器学习/深度学习 搜索推荐 API
淘宝/天猫按图搜索(拍立淘)API的深度解析与应用实践
在数字化时代,电商行业迅速发展,个性化、便捷性和高效性成为消费者新需求。淘宝/天猫推出的拍立淘API,利用图像识别技术,提供精准的购物搜索体验。本文深入探讨其原理、优势、应用场景及实现方法,助力电商技术和用户体验提升。
|
2月前
|
JSON 关系型数据库 测试技术
使用Python和Flask构建RESTful API服务
使用Python和Flask构建RESTful API服务
112 2
|
2月前
|
Unix API 索引
Elasticsearch集群使用 _cat/health API
Elasticsearch集群使用 _cat/health API
44 1
|
6天前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
11天前
|
JSON API 数据格式
京东商品SKU价格接口(Jd.item_get)丨京东API接口指南
京东商品SKU价格接口(Jd.item_get)是京东开放平台提供的API,用于获取商品详细信息及价格。开发者需先注册账号、申请权限并获取密钥,随后通过HTTP请求调用API,传入商品ID等参数,返回JSON格式的商品信息,包括价格、原价等。接口支持GET/POST方式,适用于Python等语言的开发环境。
63 11