优化OpenSearch的搜索结果

版权声明:本文为农场老马原创文章,未经农场老马允许不得转载。 https://blog.csdn.net/a345017062/article/details/52672937

前面介绍了OpenSearch的基本使用(使用OpenSearch为应用提供搜索功能),一个小型的搜索服务很容易搭建。但具体应用到某个业务时,可能我们对默认的搜索结果并不满意,这里介绍下OpenSearch在搜索结果的调优方面提供的方法。

调优入口

使用OpenSearch时,要影响搜索结果,可以在两个地方下功夫。

查询

一条OpenSearch查询语句可以包含多种形式的子句,除了最核心的必选query子句之外,其它可选的子句类型也可以从不同的维度影响搜索结果。子句类型有:query、config、sort、filter、distinct、kvpairs、aggregate几种。
1、在query子句中,通过()、AND、OR、对关键词进行组合,使用ANDNOT对关键词进行排除。使用RANK对关键词顺序进行调优。

//搜索“鼻炎”相关的文章,同时过滤掉“过敏性鼻炎”的文章,如果标题中包含鼻炎,则在搜索结果中排在前面。
 query=(default:'鼻炎' ANDNOT default:'过敏性鼻炎' ANDNOT title:'过敏性鼻炎')RANK title:'鼻炎'

2、在config子句中,通过设置rerank_size,控制参与精排的item数目来调整性能。
3、通过filter子句中设置过滤条件,影响搜索结果。
4、通过sort子句设置搜索结果的排序方式。
5、通过distinct对搜索结果进行聚合。
6、通过kvpairs向细排表达式传参,间接调整搜索结果。
7、aggregate子句用来设置搜索结果的统计信息。

关于子句更详细的介绍在这里:
https://help.aliyun.com/document_detail/29156.html

搜索结果相关性配置

鉴于搜索引擎面对的数据量很大,OpenSearch把搜索过程拆分为两步:粗排和细排。

粗排和细排的目标不同,需要处理的数据量不同,OpenSearch提供了不同的算法集。算法集中的算法有些在粗排和细排中都能使用,有些只能在细排中使用。我们在算法集中选择算法进行组合,来影响OpenSearch每一步的排序结果。

搜索相关性函数

上面提到了搜索优化的两个着手点:查询入口的查询语句,搜索结果相关性配置。这两个地方都可以调用OpenSearch提供的相关性函数,从相关性函数中获取到本次搜索的context信息,通过对context做出选择来影响搜索结果。

每个相关性函数的详细解释可以看这里:
https://help.aliyun.com/document_detail/29131.html

不同相关性函数可以应用的地方不一样。有的只能用于粗排,有的只能用于细排,有的可以用在查询语句中,有的几个地方都可以使用。

这里以对丁香医生的健康科普文章搜索为例,写几个相关性函数使用场景

//粗排中,使用bm25和文档新旧程度两个参数进行排序,权重为3:1。
static_bm25()*3+timeliness(time)
//细排中,只保留发布时间在1周以内的文章。
now()-time/1000>7*24*60

个性化搜索

通过kvpairs向搜索引擎传参,在细排中通过tag_match获取参数值,并根据值不同调整搜索结果不同因子的权重。

比如,要简单的实现丁香医生App中的个性化推荐功能。
1、为所有文章赋一个tag属性,如,母婴(1)、营养(2)、慢性病(3)、两性(4)等。
2、记录用户所有浏览过的文章,积累一段时间的数据之后,对用户点过的文章的tag属性进行统计,作为用户的兴趣点,记录在用户的user信息中。如,母婴(1):0.5,营养(2):0.4,其它:0.1。
3、当用户使用丁香医生的搜索“感冒”时,在query中附加上用户的兴趣点,组织成查询语句:query=default:’感冒’&&kvpairs=user_tag:1=0.5:2=0.4。
4、在细排中添加表达式:tag_match(user_tag, tag, mul, sum)。则对粗排结果进行细排时,会对每条搜索结果计算个性化得分。对tag属性为“母婴”的文章,分数为:1*0.5,tag属性为“营养”的文章,分数为:1*0.4,其它tag属性的文章,得分为0。

猜你喜欢

转载自blog.csdn.net/a345017062/article/details/52672937