Чтобы это работало, вам понадобятся три вещи:
Пример схемы базы данных:
текст
+---------+----------------------------------------------+
| text_id | text |
+---------+----------------------------------------------+
| 1 | The quick brown fox jumps over the lazy dog |
| 2 | The slow brown foxes jump over the lazy dogs |
+---------+----------------------------------------------+
слово
+-------+---------+
| word | text_id |
+-------+---------+
| fox | 1 |
| foxes | 2 |
| dog | 1 |
| dogs | 2 |
+-------+---------+
Получив это, скажем, кто-то ищет "foxs dogg
", вы будете строитьзапрос как этот:
SELECT text FROM text
LEFT JOIN word w1 ON w1.text_id = text.text_id AND LEVENSHTEIN(w1.word, "foxs") < 3
LEFT JOIN word w2 ON w2.text_id = text.text_id AND LEVENSHTEIN(w2.word, "dogg") < 3
GROUP BY text.text_id
HAVING COUNT(*) = 2
... где:
- Каждое слово имеет
LEFT JOIN
(например: foxs
и dogg
) - У вас есть предложение
HAVING
, которое содержит общее количество слов (например: HAVING COUNT(*) = 2
) - Указано максимальное расстояние для каждого слова (например:
LEVENSHTEIN(...) < 3
)
Приведенное выше вернет обе записи.
Вот еще один пример:
SELECT text FROM text
LEFT JOIN word w1 ON w1.text_id = text.text_id AND LEVENSHTEIN(w1.word, "foxs") < 3
LEFT JOIN word w2 ON w2.text_id = text.text_id AND LEVENSHTEIN(w2.word, "slows") < 3
GROUP BY text.text_id
HAVING COUNT(*) = 2
Выше приведено только text_id = 2
.
Теперь, прежде чем идтисумасшедшая реализация этого, вы должны знать, что несколько предложений JOINКак и выше, таблица, содержащая миллионы записей (слов), будет иметь очень большое влияние на производительность .
Хотя это рабочий пример, вы действительно должны посмотретьдля уже реализованного алгоритма поиска, например Solr's SpellCheck component.