我正在尝试使用对 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
中) data) 应该被转义,并且 ,
将指示我正在寻找的两个字符串之间的分割。我理解不正确是什么?无论如何,将其作为全文查询运行有什么意义吗?
最佳答案
感谢@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
运行此查询时,我还必须进行以下调整。
不要像平常那样构建查询,尝试绑定(bind)变量;
$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)")
关于MySQL 对 JSON 数据进行全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36354790/