#mysql #sql #search #text
Вопрос:
Я использую простой mysql-ПОДОБНЫЙ запрос, подобный этому:
SELECT * FROM myTable WHERE field LIKE 'aaa%' ORDER BY field2
У меня есть полнотекстовый индекс на «поле», и все равно он очень медленный. Я понял, что есть возможность использовать match. В чем разница? Как? Каков наилучший подход для моего использования? Обратите внимание, что я использую «%» для всего, что начинается с «ааа».
ОБНОВЛЕНИЕ: В итоге я использовал что-то вроде этого: SELECT
*, MATCH (name) AGAINST ('a*' IN BOOLEAN MODE) AS SCORE
FROM
users
WHERE
MATCH (name) AGAINST ('a*' IN BOOLEAN MODE)
ORDER BY SCORE, popularity DESC LIMIT 4
Одна вещь, которую я хотел бы изменить, заключается не в том, чтобы упорядочивать сначала по БАЛЛАМ, а затем по популярности моего поля, а вместо этого упорядочивать с помощью простой весовой функции, что-то вроде 0,5*БАЛЛА 0,5*популярности. Как?
Ответ №1:
LIKE
не использует полнотекстовый индекс. Чтобы использовать полнотекстовый индекс, вы должны использовать match (как вы сказали):
SELECT *
FROM myTable
WHERE MATCH(field) AGAINST ('aaa*' IN BOOLEAN MODE)
ORDER BY field2
В Руководстве по MySQL есть обширная глава, посвященная функциям полнотекстового поиска.
Комментарии:
1. Интересный.. У кого-нибудь есть какие-либо эквивалентные запросы для DB2 или sybase? Google не очень помогает.
2. @user606723 ознакомьтесь с этой статьей: Полнотекстовый поиск с помощью текстового поиска DB2
3. Я обновил свой запрос, указав «по порядку». Как я могу это добавить?
4. @Noam так же, как вы сделали бы в своем запросе 😉
5. @Noam
ORDER BY (0.5*SCORE 0.5*popularity)
на самом деле должен работать