开放搜索常见错误解决方案

tech2025-03-29  4

1,什么是开放搜索

开放搜索OpenSearch是一款结构化数据搜索托管服务,为移动应用开发者和网站站长提供高效,稳定,简单,低成本的搜索解决方案。 是基于阿里自主研发的大规模分布式搜索引擎平台,该平台承担了阿里的全部的搜索业务,淘 宝,1688等。 OpenSearch以平台服务化的方式,将专业搜索技术简单化,低门槛化和低成本化, 让专业搜索引擎技术不再成为客户的业务瓶颈,以低成本实现产品搜索功能并快速迭代。

2,召回配置

Query子句:

条件之间关系:AND,OR,ANDNOT,RANK,必须大写

Filter子句:

1.条件运算符:=,!=,>,<,>=,<=,in(field,‘value1|value2’), notin(field,‘value1|value2’) 2.算术运算符:+,-,*,/,&,|,^

更多请查看官方文档:https://help.aliyun.com/document_detail/180032.html?spm=a2c4g.11186623.6.597.239e656dLPtpUw

3,常见错误代码

6015:因流量超出配额,请求被丢弃 :OpenSearch的配置太低,在控制台提 高OpenSearch的资源配额6113:Filter子句错误 :检查Filter子句语法是否拼接错误6315:索引字段不存在 :检查Query子句中的字段是否已建立索引6315:常量表达式类型错误:检查Sort排序时,表达式计算时常量是否为小数

更多请查看官方文档:https://help.aliyun.com/document_detail/29146.html?spm=a2c4g.11186623.6.962.45237f76drgKRf

4,使用注意点 1. filter子句:

1,使用in关键字查询数据时,不要写成in(value1,value2),这里和sql的写法是不一样的 正确的写法:in(field1,'value1|value2|value3') 注意:字段对应值value必须用单引号''括起来,且多个value值用|分割 2,不等号不要写成<>,正确写法:!= 否则会报:6113:Filter clause error 3,代码中用OR连接的条件使用空格分隔多个条件会失效 代码中:(age = 18 OR age = 20 ) 转化后:(age=18ORage=20)导致报:6113:Filter clause error 正确写法:((age = 18) OR (age = 20))

2.query子句:

必填,且不能为空,字段名必须要在索引中,且字段值必须用单引号‘’括起来

3.sort子句:

设置精排时,表达式相乘时的常量不能为小数 normalize(field1)*10+normalize(field2)*10+normalize(field3)0.5+first_phase_score10 否则会报:6315:常量表达式类型错误 正确写法: normalize(field1)*10+normalize(field2)*10+normalize(field3)5/10+first_phase_score10

4.返回总记录数与返回结果列表长度不一致,检查分页处理是否正确,opensearch中的起始页是从0开始

例:返回总记录数total = 6,而结果集list = [],没有数据

{ "code": 0, "msg": "成功", "data": { "total": 6, "page": 1, "page_size": 30, "total_page": 1, "list": [] }, "hint": "成功" }

5,Java示例代码 1.导入相应maven依赖

<dependency> <groupId>com.aliyun.opensearch</groupId> <artifactId>aliyun-sdk-opensearch</artifactId> <version>3.1.3</version> </dependency>

2.简单代码描述 这里只描述项目中使用到的方法,详情请参考官方文档:https://help.aliyun.com/document_detail/52360.html?spm=a2c4g.11186623.4.2.35316780tLbg3h

opensearch连接配置 yml配置文件 aliyun #替换为opensearch应用名 appName:XXX #替换accessKey accessKey:XXX #替换secret accessSecret:XXX #替换应用API访问地址 host:XXX 定义Config对象 List<String> fields = new ArrayList<>(); Config config = new Config(Lists.newArrayList(appName)); config.setStart(0); //起始页 config.setHits(20); //每页返回记录数 config.setSearchFormat(SearchFormat.JSON); //返回格式 支持XML,JSON,FULLSON config.setFetchFields(fields); //返回字段 定义SearchParam对象 SearchParam searchParam = new SearchParam(config); searchParam.setQuery("default : 'value1' OR title:'value2'"); searchParam.setFilter("age >= 18 AND "); Sort sort = new Sort(); sort.addToSortFields(new SortField("time"),Order.DRCREASE); searchParam.setSort(sort); 创建并构建OpenSearch对象 OpenSearch openSearch = new OpenSearch(accessKey,accessSecret ,host); 创建OpenSearchClient对象 OpenSearchClient openSearchClient = new OpenSearchCient(openSearch); 创建SearcherClient对象 SearchClient searchClient = new SearchClient(openSearchClient); 执行并返回查询结果 SearchResult searchResult = searchClient.execute(searchParam);

目前只是总结了项目中使用到的API及遇到的常见错误问题,网上关于opensearch的问题贴和博文好像很少,不能及时找到解决方案,所以如果有遇到其它问题的朋友欢迎把你们的解决方案分享出来。

最新回复(0)