全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
开放搜索

Array数组类型说明

更新时间:2017-09-06 16:40:00

ARRAY数组类型的前世今生

本文主要对Array类型的使用场景、数据推送及搜索语法进行系统的介绍,方便大家理解。

什么场景下适合使用ARRAY类型?

Array类型即为数组类型,数组类型即由相同类型的若干个元素组织在一起的数据,期望在搜索的时候对于每一个元素都可以执行单独的查询。比如小说的标签tags,包含“悬疑”、“穿越”、“古典”,希望在搜索“悬疑”的时候能找到该篇小说。

如何推送ARRAY类型的数据?

目前OpenSearch支持多种方式的数据推送方式,那我们就从每个途径来分开阐述如何进行数据推送。

API方式

ARRAY类型需要采用JsonArray的方式来上传数据。如:

  1. [{"fields": { "id": "0","int_array": [14,85],"float_array": [14.0,85.0],"string_array": ["abc","xyz"]},"cmd": "ADD"}]

具体数据上传接口,请参考 开发指南->V3(标准/高级)API参考手册->应用操作接口->数据处理

SDK方式

这里以php sdk为例,其他sdk做法类似。

  1. <?php
  2. require('php_2.0.4/CloudsearchClient.php');
  3. require('php_2.0.4/CloudsearchIndex.php');
  4. require('php_2.0.4/CloudsearchDoc.php');
  5. define('ACCESSKEYID', '您的阿里云AccessKeyId');
  6. define('SECRET', '您的阿里云AccessKeySecert');
  7. define('APP_NAME', '您的应用名称');
  8. define('KEY_TYPE','aliyun'); #固定值
  9. #每个应用具体host值请参考应用管理->应用详情->API入口,打开debug接口方便调试
  10. $client = new CloudsearchClient(
  11. ACCESSKEYID,
  12. SECRET,
  13. array('host' => 'http://opensearch-cn-hangzhou.aliyuncs.com', 'debug' =>true),
  14. KEY_TYPE
  15. );
  16. $doc = new CloudsearchDoc(APP_NAME, $client);
  17. $json = <<<EOF
  18. [{"fields": { "id": "0","int_array": [14,85],"string_array": ["abc","xyz"]},"cmd": "ADD"}]
  19. EOF;
  20. echo $doc->add($json, '您要推送数据的表名');
  21. echo $client->getRequest(); #打印发送的请求串,前提是CloudsearchClient的debug打开
  22. ?>

数据源方式

数据源配置允许用户对于数据源数据进行多种格式的解析操作,如果定义了ARRAY类型的字段,可以在该字段上选择MultiValueSpliter插件,定义好多值分隔符,比如上例中的tags,在数据库表中字段内容为:“穿越,悬疑,言情”,那么多值分隔符为英文逗号:“,”,如图所示即可。该插件会自动将数据库中字段转化成为引擎识别的ARRAY类型。


ARRAY类型如何进行检索?能实现怎样的效果?

ARRAY类型的每一个元素都可以单独访问,不管是用在query子句,还是filter子句,如上例中的tags字段(内容为:穿越,悬疑,言情),可以通过query=tags:’穿越’来找到该文档;也可以通过query=title:’步步惊心’&&filter=tags=”穿越”,来实现标签为“穿越”的名字包含“步步惊心”的小说。同时需要注意一点的是,搜索结果对于Array类型是按照字符串返回的,元素之间使用’\t’分隔,而不是数组。



相关问题

Q: 为什么没有text_array类型,text与string_array有什么区别?
A: text类型(包含text、sws_text、nws_text、mws_text)涉及到分词,本身支持的是模糊搜索,所以没有数组的概念,而string_array指的是每个元素的精确匹配,很可能这里的单个元素本身是由多个词组组成的,但是没关系要求的是全部匹配。

Q: 有没有方法获得array类型的元素个数?
A: 系统提供了fieldlen(array_field)的参数,可以获取元素个数。

本文导读目录