То, что вы хотите сделать, называется нечетким поиском. Вы можете использовать функцию SOUNDEX в MySQL, зарегистрированную здесь:
http://dev.mysql.com/doc/refman/5.7/ru/string-functions.html#function_soundex
Запрос будет выглядеть так:
SELECT * FROM dictionary
, где SOUNDEX (word
) = SOUNDEX (: yourSearchTerm)
... где ваш поисковый запрос связан с: значением параметра yourSearchTerm.
Следующим шагом будет попытка реализовать и использовать функцию Levenshtein в MySQL. Один из них описан здесь:
http://www.artfulsoftware.com/infotree/qrytip.php?id=552
Левенштейн расстояние между двумя строками - это минимальное количество операций, необходимых для преобразования одной строки в другую, где операция может быть вставкой, удалением или заменой одного символа.
blockquote>Вы также можете рассмотреть возможность поиска базы данных, предназначенные для полного поиска текста, такие как Elastic Search, который обеспечивает это изначально:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query -dsl-нечеткой query.html
Вы должны денормализовать данные. Добавить поле в Tag
для dateLastUsed
и отсортировать по нему. Обновите это, когда сообщение помечено. В зависимости от требований к вашему продукту вам также может потребоваться обновить его, когда тег будет удален из публикации. В этом случае вам нужно будет просмотреть все сообщения тега и назначить dateLastUsed
самых последних из этих сообщений.
Также вы сказали: «... для каждого извлеченного тега выполните дополнительное извлечение его сообщений». Вы НИКОГДА не должны получать сообщения тега или теги сообщения, но ВСЕГДА используйте связь. Отношения на порядки быстрее.