Как реализовать эффективный алгоритм поиска при использовании PHP и базы данных MySQL? - PullRequest
2 голосов
/ 24 января 2012

Я новичок в веб-дизайне, особенно в бэкэнд-дизайне, поэтому у меня есть несколько вопросов о реализации функции поиска в PHP. Я уже установил соединение MySQL, но я не знаю, как получить доступ к определенным строкам в таблице MySQL. Также правильно ли реализована подобная текстовая функция, учитывая, что я хочу вернуть результаты, почти совпадающие с поисковым термином? Прямо сейчас я могу вернуть только результаты, которые абсолютно одинаковы, или это не дает никакого результата. Например, если я буду искать «tex», он будет возвращать результаты, содержащие «текст»? Я понимаю, что в моем коде и логике много ошибок, поэтому, пожалуйста, помогите, если это возможно. Событие - это имя строки, к которой я пытаюсь получить доступ.

$input = $_POST["searchevent"];
while ($events = mysql_fetch_row($Event)) {
$eventname = $events[1];
$eventid = $events[0];
$diff = similar_text($input, $event, $hold)
if ($hold == '100') {
echo $eventname;

break;

else
echo "no result";

}

Спасибо.

Я заметил, что в некоторых комментариях упоминались более эффективные способы выполнения поиска, чем при использовании функции "схожий текст", если бы я использовал функцию LIKE, как бы она была реализована?

Ответы [ 2 ]

1 голос
/ 24 января 2012

Пара различных способов сделать это:

Более быстрый (с точки зрения производительности): select * FROM Table where keyword LIKE '%value%' Хитрость в этом - размещение%, который является подстановочным знаком, говоря что либо ищите всекоторая заканчивается или начинается с этого значения.

Более гибкой, но (немного) более медленной, может быть функция REGEXP:

Select * FROM Table WHERE keyword REGEXP 'value'

Это использует мощь регулярных выражений, так что вы можетеполучить настолько сложный, как вы хотели с ним.Однако, оставив, как указано выше, вы получите своего рода «Google для бедняков», позволяющий выполнять поиск по частям в полях.

Важная часть появляется, если вы пытаетесь искать имена.Например, любой из них найдет имя «кузнец», если вы будете искать SMI.Тем не менее, ни один не найдет «Джон Смит», если будут разделены поля имени и фамилии.Таким образом, вам нужно будет выполнить конкатенацию для поиска, чтобы найти либо Джона, либо Смита, либо Джона Смита, либо Смита, Джона.Оттуда может получиться снежный ком.

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

SELECT * FROM table WHERE first LIKE '%value%' OR last LIKE '%value%' OR address LIKE '%value'
0 голосов
/ 24 января 2012

Посмотрите на приведенный ниже пример:

$word2compare = "stupid";

$words = array(
    'stupid',
    'stu and pid',
    'hello',
    'foobar',
    'stpid',
    'upid',
    'stuuupid',
    'sstuuupiiid',
);

while(list($id, $str) = each($words)){
    similar_text($str, $word2compare, $percent);
    if($percent > 90)    // Change percentage value to 80,70,60 and see changes
    print "Comparing '$word2compare' with '$str': ";

}

Вы можете проверить с помощью параметра $percent, насколько сильное соответствие вы хотите применить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...