我正在尝试使用Sqlite3 FTS3/4表的持久化(在Yesod中)的match
操作符。
我已经成功地创建了自己的匹配运算符:
-- | 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 documentation https://sqlite.org/fts3.html#simple_fts_queries》中介绍了此类查询
阅读持久化文档和Filter
定义,可以使用BackendFilter
创建此过滤器,但我还没有找到实际使用它的任何示例。
同样让我困惑的是在PersistFilter
中用作构造函数的类型族BackendSpecificFilter
的使用。
我希望能够编写如下查询:
mkPersist persistSettings [persist|
User
forename String
surname String
bio String
|]
users <- runDB $ selectList [ User `matchAll` searchedTerms ] []
有人能告诉我在这种情况下使用BackFilter
的正确方法吗?
谢谢
https://stackoverflow.com/questions/51239487
复制相似问题