Это может быть очень сложно, и я лично не знаю ни о каких хороших сторонних библиотеках, хотя я уверен, что они существуют. Однако другие могут предложить некоторые консервативные решения.
Я писал нечто подобное с нуля несколько раз в прошлом. Если вы пойдете по этому пути, это, вероятно, не то, что вы хотели бы делать в PHP самостоятельно, поскольку каждый запрос будет включать получение всех записей и выполнение ваших расчетов на них. Почти наверняка это будет связано с созданием набора таблиц индексов, соответствующих вашим требованиям.
Например, вам придется придумать правила для того, как вы себе представляете, что «Милуоки» может в конечном итоге записаться как «Милуоки». Моим решением было сделать сжатие гласных и дублирование (не уверен, что это на самом деле поисковые термины). Таким образом, Милуоки будет индексироваться как:
- милуоки
- m_lw__k __
- m_lw_k_
Когда в поисковом запросе указывалось "milwaukee", я запускал тот же процесс для ввода текста, а затем выполнял поиск в таблице индексов для:
SELECT cityId,
COUNT(*)
FROM myCityIndexTable
WHERE term IN ('milwaukee', 'm_lw__k__', 'm_lw_k_')
Когда в поисковом запросе указывалось «milwakee», я запускал тот же процесс для ввода текста, а затем выполнял поиск в таблице индексов для:
SELECT cityId,
COUNT(*)
FROM myCityIndexTable
WHERE term IN ('milwaukee', 'm_lw_k__', 'm_lw_k_')
В случае с Милуоки (правильно написано), для счета будет возвращаться «3».
В случае с Милуаки (написано неправильно) для счетчика будет возвращено «2» (поскольку он не будет соответствовать шаблону m_lw__k__
, так как в середине у него был только один гласный).
Если вы сортируете результаты по количеству, вы в конечном итоге соблюдаете одно из ваших правил, что «Милуоки» будет в конечном итоге отсортировано как возможное совпадение, чем «Милуоки».
Если вы хотите построить эту систему в общем виде (как намекает использование в запросе $table
), то вам, вероятно, понадобится другая таблица сопоставления где-то там, чтобы сопоставить ваши термины с соответствующей таблицей.
Я не утверждаю, что это лучший (или даже хороший) способ сделать это, просто то, что я сделал в прошлом, которое может оказаться полезным для вас, если вы планируете попытаться сделать это без третьего партийное решение.