包含多个 etx_contains() 运算符的查询

当您在查询中指定 etx_contains() 运算符时,该运算符必须能扫描索引。如果执行某个查询且没有提供 etx 索引,那么 GBase 8s Excalibur Text Search DataBlade 模块将返回一个错误。

这将影响应如何撰写复杂查询。例如,假设您希望查找提及 lemon zest 的食谱或包含 orange rind 的原料。该查询中必须使用两个单独的 etx_contains() 运算符。遗憾地是,以下查询类型将返回一个错误,因为数据库服务器不能针对两个 etx_contains() 运算符使用一个索引扫描:
SELECT id FROM recipes 
        WHERE etx_contains(recipe, Row ('lemon zest', 'SEARCH_TYPE = PHRASE_EXACT'))
        OR
                    etx_contains(ingredients, Row ('orange rind', 'SEARCH_TYPE = PHRASE_EXACT'));
必须将该查询重新撰写为由 UNION 运算符组合在一起的两个单独查询,如以下示例中所示:
SELECT id FROM recipes 
        WHERE etx_contains(recipe, Row ('lemon zest', 'SEARCH_TYPE = PHRASE_EXACT'))
UNION
SELECT id FROM recipes 
        WHERE etx_contains(ingredients, Row ('orange rind', 'SEARCH_TYPE = PHRASE_EXACT'));
同样,包含两个 etx_contains() 运算符的 AND 子句也将返回一个错误。可供选择的办法是重新撰写该查询,如以下示例中所示:
SELECT id FROM recipes 
        WHERE etx_contains(recipe, Row ('lemon zest', 'SEARCH_TYPE = PHRASE_EXACT'))
AND id IN
  (SELECT id FROM recipes 
        WHERE etx_contains(ingredients, Row ('orange rind', 'SEARCH_TYPE = PHRASE_EXACT')));

这种查询类型的查询规划显示了两个索引扫描的结果的半连接。另一个方法是针对同一个表使用两个表别名,并通过一个唯一列将该表与其自身连接。

可以对同一个或多个表中的多个列执行多个 etx_contains() 运算符,只要不将这些运算符指定在同一个 WHERE 子句中。检查查询规划,以确保数据库服务器已为 etx_contains() 运算符选择索引扫描。