我正在尝试将match
Sqlite3 FTS3/4 表的运算符与 Persistent (在 Yesod 中)一起使用。
我已经成功创建了自己的匹配运算符:
-- | Implements the `match` operator. This operator is specific to Sqlite3 and
-- is used to look for keywords in FTS3/4/5 tables.
match :: EntityField record Text -- ^ Field to filter on
-> Text -- ^ Text to compare with
-> Filter record -- ^ Resulting filter
match field val = Filter field (Left val) (BackendSpecificFilter "match")
它工作正常,但不允许使用 Sqlite3 FTS3/4 表的非常特定(奇怪?)的功能:您可以指定表名而不仅仅是列名。效果是match
操作员将在表的每一列中查找搜索词。
这意味着您可以编写如下查询:
SELECT *
FROM tablename
WHERE tablename MATCH "hello";
此类查询在 Sqlite3 FTS3/4 文档https://sqlite.org/fts3.html#simple_fts_queries中进行了描述
阅读 Persistent 文档和Filter
定义,可能可以使用 a 创建此过滤器,BackendFilter
但我还没有找到任何实际使用它的示例。
让我感到困惑的是类型族的使用,BackendSpecificFilter
它在PersistFilter
.
我希望能够编写如下查询:
mkPersist persistSettings [persist|
User
forename String
surname String
bio String
|]
users <- runDB $ selectList [ User `matchAll` searchedTerms ] []
有人可以告诉我BackFilter
在这种情况下使用的正确方法吗?
谢谢