云搜索查询以提高范围内的精确匹配

cloudsearch query to boost exact match on range

在云搜索中结构化查询。

我有几个要搜索的字段。

在字段一上,用户选择“2” 在字段二上,用户选择“1”

我想运行将其作为范围查询,以便返回的结果为 -1 到 +1

例如。在字段 1 上,范围为 1,3,在字段 2 上,范围为 0,2

我想做的是对结果进行排序,使同时匹配字段 1 和字段 2 的结果位于顶部,其余的在其下方。

例如。其中字段一 = 2 和字段二 = 1 将在顶部,其余部分没有任何特定顺序,

注意:我确实需要按距离对结果进行排序,这样所有完全匹配的结果都是按距离排序的,然后其余的都按距离排序。

我确定我可以通过 2 个查询来完成此操作,只是尽可能在一个查询中运行以减轻负载。

假设您的字段是 'a' 和 'b',指定的值是 a=2b=1(在您的示例中,除了我已经命名字段'a' 和 'b' 而不是 'one' 和 'two')。以下是您查询的各种字词。

范围查询

这是对范围 a±1 和 b±1 的查询,其中 a=2b=1:

q=(and (range field=a[1,3]) (range field=b[0,2]))

排名表达式

对于您的排名表达式,使用绝对值计算基于距离的分数,这样分数 'a' 和 'b' 就不会相互抵消(就像 a=3,b=0 一样,因为示例):

expr.rank1=abs(a-2)+abs(b-1)

按排名排序

定义了一个名为 rank1 的排名表达式,我们现在要对其进行排序,从最低值开始('0' 表示 a=2,b=1):

sort=rank1 asc

Return排名

出于调试目的,您可能需要 return 排名分数:

return=rank1

将所有这些术语放在一起,您就得到了查询。

更多可能有用的东西

如果你想以非线性的方式获得幻想和惩罚,你可以使用 exp。例如,如果您想要区分 'a' 和 'b' 两者相差 1 与 'a' 是完全匹配并且 'b' 相差 2(例如 a=3,b=2 将排在 a=2,b=3 之前,即使之前的排名者会给他们两个分数 2):

expr.rank1=exp(abs(a-2))+exp(abs(b-1))

并且您可以使用布尔逻辑和三元运算符来检测和选择满足特定条件的特定结果,例如,当 'a' 和 'b' 符合目标时给予很大的提升,a当 'a' 'b' 达到目标等时提升较小(因为我们按从低到高排序,排名提升实际上是通过减少结果):

((a==1&&b==2)?0:100)+((a==1||b==2)?0:1000)+abs(a-1)+abs(b-2)

http://docs.aws.amazon.com/cloudsearch/latest/developerguide/configuring-expressions.html