Сфинкс: исключение PDO с определенными символами - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь заставить поисковый сервер Sphinx работать с PDO, но он вызывает синтаксическую ошибку при использовании функции MATCH () в определенных сценариях.

Ex:.

В моем коде я разделяю поисковый запрос по пробелам, а затем объединяю его, используя оператор | (OR). Если кто-то наберет test > 3, в функции сопоставления он станет (test | > | 3). Эта комбинация вызывает: Syntax error or access violation: 1064 main_idx: syntax error, unexpected '|' near ' > | 3'. Я не думаю, что это проблема побега, потому что символ > отсутствует в списке побега, и даже если вы попытаетесь его избежать, он не сработает. Это ошибка в версии Sphinx, которую я использую? Или я что-то не так делаю?

Я использую Sphinx версии 2.2.11. На самом деле это экземпляр докера, представленный этим образом: jamesrwhite / sphinx-alpine: 2.2.11 Версия PHP - 7.2.

Это мой нерабочий код:

$searchQuery = "SELECT * FROM main_idx WHERE MATCH(:search)";
$dbh = new PDO('mysql:host=127.0.0.1;port=9306', 'root', 'root');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare($searchQuery);
$stmt->bindValue('search', 'test | > | 3');
$stmt->execute();

Тот же код отлично работает, если я использую расширение MySQLi. Он также отлично работает с PDO и Sphinx версии 2.2.6. Должно быть что-то изменилось между 2.2.6 и 2.2.11. Кто-нибудь сталкивался с этой проблемой?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Такое поведение вызвано этой ошибкой http://sphinxsearch.com/bugs/view.php?id=2305 и этим исправлением https://github.com/sphinxsearch/sphinx/commit/d9923f76c7724fa8d05a3d328e26a664799841b7. В предыдущей редакции '> | был поддержан. Мы в Manticore Search (ответвление от Sphinx) проверим правильность исправления и сделаем лучшее исправление, если это не так. Спасибо за указание на это.

Между тем вы можете использовать 2.2.8 из http://sphinxsearch.com/downloads/archive/ или строить вручную из последней ревизии, которая поддерживает синтаксис (https://github.com/sphinxsearch/sphinx/commit/f33fa667fbfd2031ff072354ade4b050649fbd4e)

[ОБНОВЛЕНО] Исправление правильное. Было неправильно не показывать ошибку об этом в предыдущих версиях, если у вас нет спецификации. символ (>) в вашей charset_table. Чтобы обойти это, вы можете добавить> к вашей charset_table, а затем экранировать его в поисковом запросе, например ::

mysql> select * from idx_min where match('test | \\> | a');
+------+---------+----------+-------+------+
| id   | doc     | group_id | color | size |
+------+---------+----------+-------+------+
|    7 | dog > < |        5 | red   |    3 |
+------+---------+----------+-------+------+
1 row in set (0.00 sec)

mysql> select * from idx_min where match('test | \\< | a');
+------+---------+----------+-------+------+
| id   | doc     | group_id | color | size |
+------+---------+----------+-------+------+
|    7 | dog > < |        5 | red   |    3 |
+------+---------+----------+-------+------+
1 row in set (0.00 sec)

или

$stmt->bindValue('search', 'test | \\< | a');

в PDO.

Там по-прежнему обнаружена небольшая ошибка, которая заключается в том, что если не специфицированный символ отсутствует в charset_table, он не генерирует ошибку. Например.

mysql> select * from idx_min where match('test | j | a');
Empty set (0.00 sec)

работает нормально, хотя j отсутствует в charset_table. Я отправил сообщение об ошибке в наш баг-трекер https://github.com/manticoresoftware/manticoresearch/issues/156 Еще раз спасибо за помощь, чтобы указать на это.

0 голосов
/ 16 января 2019

скажем, например, вы хотите сделать точное совпадение. Мне нравится делать точное совпадение, как это ...

...WHERE MATCH(column) AGAINST('happy I am') AND column LIKE '%happy I am%';

, что гарантирует, что я точно соответствую тому, что я хочу сопоставить, где, как если бы я не включил AND LIKE ... это соответствовало бы счастливому ИЛИ ИЛИ ИЛИ

...