2017-02-07 2 views
0

Можно ли отключить стоп-слова для одной таблицы или даже одного столбца? Я знаю, что есть варианты отключить его по всему миру. Мне нужно это для использования двух типов поиска:
a) Стандартный поиск в булевом режиме (здесь игнорируются все стоп-слова)
b) Автозаполнение поиска (здесь я не хочу игнорировать любые слова, потому что если пользователь вводит '', я не знаю, целое слово или только первые 3letters

Это нормально для меня есть две колонки с такими же данными, например:. название и title_autocomplete, но как я могу отключить механизм игнорируемых слов только для одного столбцаMySQL отключает стоп-слова для одного столбца

Пример:
в) Тип пользователя «The» не возвращает ничего, потому что «the» - это секундомер
b) Тип пользователя «The» возвращает все, начиная с «the» или просто содержащего 'the' word like 'Thermal ..' или 'The important important ..'

И я хочу иметь эти две опции, используя один экземпляр сервера mysql.

+0

Если пользователь вводит «» в автозаполнения поле, вы хотите, чтобы отобразить «Властелин колец», «Гарри Поттер и Орден Феникса» и «Тепловые динамики»? И если вы используете его в своем первом режиме поиска, вам нужно только получить «Тепловую динамику»? – Solarflare

+0

@Solarflare проверить обновление. В autocomplete я хочу, чтобы все начиналось с 'the' или просто содержало 'the'. В стандартном поиске лечите 'the' как секундомер. – jgr

+0

Мой вопрос был на самом деле, если вы хотите получить результаты, начинающиеся с «the» (например,как вы упомянули, «Thermal ..» или «The most important»), или также результаты, содержащие слово, начинающееся с «в любом месте названия» (например, «Летом ...» или «Руководство по тепловой динамике» "), потому что я хочу убедиться, что вам действительно нужно использовать полнотекстовый поиск. – Solarflare

ответ

1

MySQL не поддерживает разные стоп-листы для разных столбцов, а также не может, например. временно запретить или включить стоп-лист (без восстановления индекса) прямо перед тем, как выполнить поиск. Но вот некоторые идеи, которые работают вокруг, что:

  • В случае, если ваш стандартный поиск действительно должен искать только полные слова, как ваш пример подразумеваемых, так, например, userinput «слово« »приведет к запросу, например match(title) against ('+the +word' in boolean mode), в то время как соответствующий поиск автозаполнения приведет к match(title) against ('+the* +word*' in boolean mode), вы можете имитировать это поведение непосредственно в своем приложении. Отключите список остановок в MySQL, но сохраните свой собственный внутренний список в своем приложении; проверьте вход пользователя и не добавляйте эти слова в свой поисковый запрос (и ничего не выполняйте, если у вас нет слов).

  • Вы можете добавить таблицу MyISAM только с вашим основным ключом и столбцом title и синхронизировать их с помощью триггеров. У InnoDB и MyISAM есть свои собственные стоп-листы, поэтому это может звучать близко к тому, что вы ищете. Но есть некоторые серьезные проблемы с этим подходом: MyISAM не поддерживает транзакции, поэтому, если вы откатите изменения в таблице InnoDB, они не будут откатываться в MyISAM. Если вы используете MyISAM для своей основной таблицы (чего вы не должны), не используйте транзакции для этой таблицы, или ваши данные статичны, это может быть вариант. Другая проблема заключается в том, что MyISAM будет удален в следующей версии MySQL.

  • Отключить список столов, добавить столбец title_withoutstopwords и сохранить «очищенную» версию вашего названия, которую вы можете использовать для стандартного поиска. Это означает, что вам нужно написать функцию, которая удаляет все временные слова из текста. Вы можете использовать вывод этой функции, например. в триггере, чтобы синхронизировать столбцы. Вероятно, это самый безопасный способ, но он будет немного длинным.

  • Отключить список остановок и затем фильтровать результаты вашего стандартного поиска в вашем клиенте (или принять, что результаты могут включать в себя временные слова).

Смежные вопросы