在cloudsearch 结构化查询中。
我正在寻找几个领域。
在第一场,用户选择" 2" 在字段2中,用户选择" 1"
我想将其作为范围查询运行,以便返回的结果为-1到+1
例如。在字段1上,范围是1,3,在字段2上,它将是0.2
我想要做的是对结果进行排序,以便匹配字段1和字段2的结果位于顶部,其余结果位于其下方。
例如。其中,字段1 = 2,字段2 = 1将位于顶部,其余字段不按任何特定顺序,
注意:我确实需要按距离对结果进行排序,以便所有精确匹配的结果都按距离排序,然后所有其余结果按距离排序。
我确信我可以使用2个查询执行此操作,只是尝试使其在一个查询中工作,如果可能的话可以减轻负载。
答案 0 :(得分:2)
假设您的字段为'a'和'b',指定的值为a=2
和b=1
(如您的示例所示,除非我将字段命名为'a'和'b '而不是'一'和'两')。以下是您查询的各种术语。
范围查询
这是范围a±1和b±1的查询a=2
和b=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=rank1
将所有这些条款放在一起,你就得到了你的疑问。
进一步有用的事情
如果您希望以非线性方式获得幻想和惩罚,可以使用exp
。例如,如果你想要区分“a”和“b”两者都是1,而'a'是完全匹配,'b'是2,例如a=3,b=2
将排在{{{ 1}}即使之前的排名会给他们两个得分:
a=2,b=3
你可以使用布尔逻辑和三元运算符来检测并选择满足某些标准的某些结果,例如,当'a'和'b'在目标上时给予大幅提升,在'a'时提供较小的提升或'b'是目标等等(因为我们从低到高进行排序,实际上通过增加结果来提高排名):
expr.rank1=exp(abs(a-2))+exp(abs(b-1))
请参阅http://docs.aws.amazon.com/cloudsearch/latest/developerguide/configuring-expressions.html