2013-03-08 5 views
3

Добрый вечер,как сравнивать части 2 строки в PHP

Я столкнулся с небольшой проблемой при попытке построить небольшой алгоритм поиска.

У меня есть таблица базы данных, содержащая имена видеоигр и имена программ. Теперь я хотел бы добавить новые предложения, извлекая и разбор XML-файлов на других серверах. Проблема заключается в следующем:

Как сравнить строки для имени продукта, чтобы он работал, даже если имя предложения не совпадает с именем продукта, хранящимся в моей базе данных, до 100%?

В качестве примера я в настоящее время с помощью этого PHP + SQL коды для сравнения строк:

$query_GID = "select ID,game from gkn_catalog where game like '%$batch_name%' or meta like '%$batch_name%' "; 

Я в настоящее время использую как оператор в сочетании с двумя дикими картами, чтобы сравнить имя предложения (batch_name) с именем в базе данных (игра).


Я хотел бы знать, как я могу улучшить это как этот метод не очень безотказный или что вы хотите назвать это, что случается:

Если база данных говорят название игры:

Deus Ex Human Revolution Missing Link

и batch_name говорит:

Deus Ex Hum революция Missing Link DLC

результат будет пустым/неправильно/ложь ... ну не найти игру в моей базе данных на всех.

То же самое что-то вроде этого:

Database = Lego Star Wars The Complete Saga
batch_name = Lego Звездные войны : Полная Сага
Результат: Ложные

Is есть лучший способ выполнить SQL-запрос?
Или как я могу попытаться заставить этот запрос работать, чтобы он мог иметь дело со строками, которые имеют специальные символы (например, -minus- & [скобки])
и/или символы, которые не включены в имена в базе данных (например, DLC , CE ...)?

+1

Исследуйте поиск FULLTEXT и используйте функцию MATCH(). http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html –

+1

это также может помочь - http://www.artfulsoftware.com/infotree/queries.php?&bw=1280 # 552 – splash21

+0

@ splash21 Я не знал, что у MySQL теперь есть Левенштейн; отличная идея! – Kato

ответ

3

Вы ищете алгоритмы нечеткого поиска и нечеткие результаты поиска. Это целая область изучения. Тем не менее, есть также несколько простых руководств, которые помогут вам начать работу, если вы займетесь быстрым Google.

Возможно, у вас возникнет соблазн попробовать что-то вроде замечательного метода PHP levenshtein, который вычисляет «близость» двух строк. Однако для этого потребуется сопоставить его с каждой записью. Если будут тысячи записей, это не может быть и речи.

У MySQL есть некоторые подходящие инструменты, которые могут помочь. Я вижу, что, когда я пишу это, кто-то уже упомянул FULLTEXT and MATCH() в комментариях. Это отличный способ.

Есть еще несколько хороших решений для изучения. Хранение индекса ключевых слов (со всеми статьями и помощниками типа/the/an/am/is/are/was/of/from удален), а затем поиск по каждому слову в поиске является простым решением. Однако это не дает больших результатов, поскольку возвращаемые значения не взвешиваются хорошо, и он вообще не локализуется.

Есть много дешевых и замечательных инструментов поиска сторонних разработчиков (на что же касается и Lucene), которые сделают большую часть этой работы для вас. Вы просто называете API, и они управляют кэшированием, ключевыми словами, индексацией, fuzzying и др. Для поиска.

Вот некоторые SO вопросы, которые связаны с нечеткими поисков, которые помогут вам найти более подробную терминологию и идеи:

+0

Благодарим вас за то, что вы предоставили так много ссылок на возможные решения, я обязательно прочитаю их все, а позже я буду решать, какой из них лучше всего работает. Кстати, могу я спросить, почему вы говорите, что использование метода levenshtein против тысяч записей не могло быть и речи? Я мог представить себе, что использование этого метода достаточно требовательно или медленно, но затем, имея тысячи записей, каждый метод, выполняющий такое сравнение, будет медленным и требующим высокой мощности ... – SubZero

+0

Levenshtein через PHP будет медленным, потому что поиск каждого запись в таблице для проведения сравнения нецелесообразна для больших наборов данных. Базы данных SQL делают много причудливых внутренних элементов для оптимизации сравнений и поиска (индекс, индекс, индекс), и в целом на этом уровне должны выполняться большие операции. – Kato

1

MySQL queries , как вы узнали, может использовать процентный символ как шутник (%) в сочетании с оператором LIKE.

У вас есть несколько решений в зависимости от того, что вы хотите точно.

  • вы можете сделать fulltext search
  • вы можете найти с помощью алгоритма языка как soundex
  • вы можете осуществлять поиск по ключевым словам

Помните, что вы можете сделать поиск в нескольких проходах (поиск точного совпадение, затем проценты со всех сторон, взорвать слова, а затем вставить% между каждым словом, поиск по ключевым словам и т. д.) в зависимости от того, имеет ли точный соответствие приоритет над закрытым поиском и т. д.

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