MySQL полнотекстовый поиск по данным JSON

mysql json full-text-search

1695 просмотра

1 ответ

Я пытаюсь повторить следующий запрос LIKE, используя полнотекстовый поиск по JSONданным;

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\""')

Однако это возвращает более 4500 строк (аналогично выполнению первого запроса только для prod_id ~ 1900 строк при выполнении первого запроса только на дату)

Насколько я понимаю, это +"text here"будет означать требуемое слово, и что буквальные двойные кавычки (присутствующие в JSONданных) должны быть экранированы, и это ,будет означать разделение между двумя строками, которые я ищу. Что я не правильно понимаю? Есть ли смысл запускать это как полнотекстовый запрос?

Автор: Novocaine Источник Размещён: 28.10.2019 08:24

Ответы (1)


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'));

Я должен был сделать это, поскольку я обнаружил, что не могу связывать переменные в полнотекстовом поиске

$sql_against = $db->quote('...AGAINST('+\"prod_id: foo\" +\"start_date: 2016-07-13\"');
$query = $db->prepare("...AGAINST($sql_against IN BOOLEAN MODE)")
Автор: Novocaine Размещён: 01.04.2016 02:31
Вопросы из категории :
32x32