MySQL 对 JSON 数据进行全文搜索

标签 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 中) 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/

相关文章:

php - 如何创建 PHP、MySQL 页面的快照或克隆...需要灵感

json - 从函数外的 json fetch 访问数据

c# - 字典的 JSON 序列化为名称 :value instead of {name:name, 值:值}

json - 嵌套结构的 Elasticsearch 映射

algorithm - 搜索多个字符串

sql-server - 全文搜索排名(SQL Server)

mysql - 在 Slick 中表达 SQL IF ELSE

mysql - 使用 ActiveRecord 解释 COUNT 查询

python - Django 使用具有相同表和字段名称的多个模型?

mysql全文搜索 "all but"查询