MySQL全文搜索JSON数据

时间:2016-04-01 11:07:55

标签: mysql json full-text-search

我正在尝试使用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数据中),并且, 1}}表示我正在寻找的两个字符串之间的分割。我没有正确理解的是什么?无论如何,将此作为全文查询运行是否有任何意义?

1 个答案:

答案 0 :(得分: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)")