0

我正在尝试将matchSqlite3 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在这种情况下使用的正确方法吗?

谢谢

4

1 回答 1

0

根据我的调查,不可能BackendFilter像创建BackendSpecificFilter. 第一个是由数据库层专门解释的,这意味着必须修补 persistent-sqlite 包才能允许我描述的内容。

于 2018-07-10T15:46:31.503 回答