【问题标题】:Mariadb case insensitive fulltext search on json columnsMariadb 在 json 列上不区分大小写的全文搜索
【发布时间】:2020-11-18 20:18:49
【问题描述】:

我正在使用 laravel,但如果需要可以使用原始 sql。

我有多个字段是 json 字段,在该 json 中有该语言的翻译数据。因此,例如 post 表具有字段标题,并且该标题是 {"en": "Title in english", "et": "Title in estonian"}

现在我需要进行全文搜索来搜索这些字段,对于某些列,我需要从所有语言中搜索术语,而不仅仅是从活动语言中搜索。

我正在使用 MariaDB 最新的稳定版。

如果我为全文搜索创建这些字段的索引,我可以很好地搜索,但搜索是区分大小写的。

如何使搜索不区分大小写? json 字段目前是 longtextutf8mb4_bin,laravel 选择它们作为 json 字段。我知道 bin 是区分大小写的排序规则,但我还能放什么,以便通过翻译的 slug 查找记录的功能(例如)仍然存在。

在 laravel 中,可以像 ->where('slug->en','some-post-slug') 这样搜索。所以我需要保持 laravel json 字段功能完整。

我已经尝试了 2 天了,我需要一些外部输入。

【问题讨论】:

    标签: php json laravel mariadb case-insensitive


    【解决方案1】:

    MySQL 文档states the following

    默认情况下,搜索以不区分大小写的方式执行。要执行区分大小写的全文搜索,请对索引列使用区分大小写或二进制排序规则。例如,可以为使用 utf8mb4 字符集的列分配 utf8mb4_0900_as_cs 或 utf8mb4_bin 的排序规则,以使其在全文搜索时区分大小写。

    我敢打赌,在 MariaDB 中也是如此。如果您更改排序规则,它将与预期的不区分大小写的搜索一起使用。你可以这样改变它:

    ALTER TABLE mytable
    CONVERT TO CHARACTER SET utf8mb4 
    COLLATE utf8mb4_general_ci;
    

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多