virtual attribute子句

子句说明

目前,引擎支持在distinct,aggregate,filter等多种子句中指定多种类型的expression。例如query:config=cluster:daogou&&query=电脑&&filter=price+MailPrice(distance)<80,在filter子句中price代表物品的基本价格,MailPrice是用户定义的一个function插件,用来计算邮寄物品的费用,二者之和代表购买该物品所需花费的整体费用

下面再进一步考虑如下几种使用场景:

* 如果该query中又增加了distinct,aggregate子句,这些子句中都用到了price+MailPrice(distance)这个expression,那么就需要用户将该expression重复写多遍,这样是不是有点不够灵活?
* 如果用户想在算分插件中获取price+MailPrice(distance)的值呢?
* 如果用户想在搜索结果中返回price+MailPrice(distance)的计算结果呢?
* 如果用户想将price+MailPrice(distance)的计算结果填充到summary里面呢?

virtual attribute功能的引入有效的解决了上面四个问题

子句语法

virtual attribute子句的语法如下:

virtual_attribute='va_description [{';' va_description}]
va_description := va_name ':' va_expression
va_name := IDENTIFIER
va_expression := arithmetic_expression | logical_expression | function_expression

其中,va_name为va_expression代表的表达式的名称,在ha3的distinct,filter,aggregate,attribute,sort各个子句中凡是用到va_expression的地方可以直接用va_name代替。在virtual_attribute中也可以使用先前声明过的va_name

示例:

1. config=cluster:daogou&&query=电脑&&virtual_attribute=va1:price+MailPrice(distance)&&filter=va1<80
2. config=cluster:daogou&&query=电脑&&virtual_attribute=va1:price+MailPrice(distance);va2:disCountPrice(va1)&&attribute=id,va1,va2&&sort=+va2

注意事项

  • 用户需要保证virtual attribute的声明顺序是拓扑有序的。目前引擎内部没有对用户声明的virtual attributes做拓扑排序,这一点需要用户自己保证。例如:virtual_attribute=va2:disCountPrice(va1);va1:price+MailPrice(distance),这种声明方式就是不合法的,需要对调va1和va2的声明位置

  • virtual attribute不支持声明常量表达式诸如:va1=123,va2="abc",va3=1+2,这几种类型的声明方式都是不支持的