【问题标题】:MySQL full text search on JSON dataMySQL 对 JSON 数据的全文搜索
【发布时间】:2016-04-01 11:07:55
【问题描述】:

我正在尝试使用对 JSON 数据的全文搜索来复制以下 LIKE 查询;

SELECT * FROM table
  WHERE response LIKE '%"prod_id": "foo"%'
  AND response LIKE '%"start_date": "2016-07-13"%'

在我的数据库中,上面的查询返回 28 行

这是我的尝试:

SELECT * FROM table
  WHERE MATCH(response)
    AGAINST('+"\"prod_id\": \"foo\"",+"\"start_date\": \"2016-07-13\""')

但是,这会返回超过 4,500 行(与仅在日期运行第一个查询时仅对 prod_id ~1,900 行运行第一个查询相同)

据我了解,+"text here" 将表示一个 必需 字,并且应该转义文字双引号(出现在 JSON 数据中),并且 , 将表示一个在我正在寻找的两个字符串之间拆分。我没有正确理解什么?无论如何,将其作为全文查询运行有什么意义吗?

【问题讨论】:

  • 我认为您忘记添加 IN BOOLEAN MODE 修饰符来激活这些布尔运算符。默认修饰符是IN NATURAL LANGUAGE MODE,它不适合您的需要。
  • 感谢@Sevle,这肯定是问题的一半——我需要的其余调整如下。
  • 这不是 5.7 JSON 列!它只是一个 TEXT 列,其中 JSON 存储为纯文本。

标签: mysql json full-text-search


【解决方案1】:

感谢@Sevle,我已经像这样调整了我的查询,它返回了正确的结果;

SELECT * FROM table
  WHERE MATCH(response)
    AGAINST('+\"prod_id: foo\" +\"start_date: 2016-07-13\"' IN BOOLEAN MODE)

逗号没有帮助,我转义了错误的字符,当然我确实需要添加IN BOOLEAN MODE。最后,我删除了我在 JSON 字符串中搜索的双引号。

值得注意的是,当我使用PHP PDO 运行此查询时,我还必须进行以下调整。

而不是像往常一样尝试绑定变量来构建查询;

$query = $db->prepare('...AGAINST('+\"prod_id: :prod_id\" +\"start_date: :start_date\"');
$query->execute(array('prod_id' => 'foo', 'start_date' => '2016-07-13'));

我必须这样做,因为我发现 I could not bind variables in full text searches

$sql_against = $db->quote('...AGAINST('+\"prod_id: foo\" +\"start_date: 2016-07-13\"');
$query = $db->prepare("...AGAINST($sql_against IN BOOLEAN MODE)")

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2016-04-30
    • 2023-03-05
    • 2019-08-02
    相关资源
    最近更新 更多