2017-02-04 11 views
0

Возможно ли использовать полный тестовый поиск в двигателе InnoDB с оператором AND для режима естественного языка? Я имею в виду запрос, как показано ниже, но со всеми словами в соответствии с требованиями:MySQL Полнотекстовый поиск И оператор

SELECT *, MATCH (body) AGAINST ('mysql database') AS score FROM post ORDER BY score DESC; 

Для этого запроса я хочу вернуть все записи, которые соответствуют оба слова: «MySQL» AND «базы данных». Я знаю, что я могу использовать + и BOOLEAN режим, но это вызывает другие проблемы, как и другие операторы, которые я хочу, чтобы игнорировать (*, -, "» ..)

+0

Оценка должна быть выше, если оба слова совпадают, не так ли? – Barmar

+0

@Barmar Я хочу вернуть только записи, где ВСЕ слова, сопоставленные - и оценка должна быть рассчитана только для этих записей для лучшей производительности. – jgr

+0

Тогда вам нужно '+' и 'IN BOOLEAN MODE'. –

ответ

1

Добавить пункт WHERE который проверяет для каждого слова в отдельности:

SELECT *, MATCH (body) AGAINST ('mysql database') AS score 
FROM post 
WHERE MATCH(body) AGAINST ('mysql') AND MATCH(body) AGAINST('database') 
ORDER BY score DESC; 
+0

Я подумал об этом, но как насчет производительности? У меня есть запросы от 3 до 10 слов, производительность будет лучше в режиме BOOLEAN с« + »в качестве префикса при условии, что я хочу оценка вычислений? Также было бы неплохо подготовить этот синтаксис динамически на основе только фразы запроса. Например, у меня есть запрос «Как разобрать json для объекта в java», который я передаю JMeter, который должен запрашивать mysql .. – jgr

+0

Логический поиск почти наверняка будет лучше, но вы сказали, что не можете использовать это. – Barmar

+0

У меня нет каких-либо ограничений для использования boolean, я просто подумал, что было бы лучше сделать это каким-то образом с естественным режимом, потому что у меня есть запросы, содержащие некоторые странные символы, такие как *, - etc, которые я хочу рассматривать как простые строки. легко игнорировать их в логическом режиме? Просто нужно подготовить запросы с оператором AND и фразой, взятой от пользователя, где любые специальные символы игнорируются и делают это с максимальной производительностью (потому что я делаю тестирование производительности). – jgr