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