фильтровать базу данных mySQL по нескольким словам в любом порядке в объединенном поле - PullRequest
2 голосов
/ 24 февраля 2010

У меня есть конкатенация в MySQL для создания поля, по которому я могу искать. Он содержит имена животных, а также имена владельцев и адреса для клиентской базы данных. Мне нужно иметь возможность искать по имени животного, владельцу и почтовый индекс в любом порядке. Таким образом, если меня зовут Джон Смит, и у меня есть собака по кличке Фидо, и я живу по почтовому индексу AB1 2CD, я хочу, чтобы поиск дал результаты, если введено любое из следующего:

"Джон Фидо AB1" "Джон AB1" "AB1 Джон" "AB1 Фидо" "Фидо 2CD" "2CD" "Fido" и т. д., т. е. любое из полей в любом порядке, а также не полные слова, поэтому «john fido AB1» должен давать тот же результат, что и «jo fi AB1»

В настоящее время у меня есть этот код PHP, занимающий одно текстовое поле на моей странице поиска, взрывающийся и затем складывающий его для добавления% между поисковыми терминами:

$list = explode(' ',$_GET["q"]);  
$q = implode('%%', $list);
if (!$q) return;  
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim, 
owner.OwnerSurnamePrim,owner.OwnerForenamesPrim,owner.OwnerID
FROM owner
Inner Join patient ON owner.OwnerID = patient.OwnerID
WHERE CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim,
owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName) LIKE '%$q%'";

Это работает для "AB1 john" и "john fido", но не для "fido john", так как оно вышло из строя в объединенном поле.

Любая помощь с благодарностью

Ответы [ 3 ]

1 голос
/ 24 февраля 2010

Полнотекстовый поиск MySQL (только таблицы MyISAM!) Может быть полезен для вас.

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

1 голос
/ 24 февраля 2010

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

Итак, сначала (в PHP) разделите строку запроса и динамически сгенерируйте ваш SQLзапрос, а затем отправить его в базу данных.Вот некоторый псевдокод, чтобы показать вам, что я имею в виду:

$keywords = explode(' ', $q);
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim, 
    owner.OwnerSurnamePrim,owner.OwnerForenamesPrim,
    owner.OwnerID

    FROM owner 
    Inner Join patient ON owner.OwnerID = patient.OwnerID";

$first = true;

foreach($keyword in $keywords):
    if($first):
        $sql += " WHERE ";
        $first = false;
    else:
        $sql += " AND ";

    $escaped = mysql_real_escape_string($keyword);
    $sql += " CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim,
        owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName) 
        LIKE '%$escaped%'";

Но будьте осторожны, это не будет где-то около быстро для размера таблиц, с которыми вы, вероятно, будете сталкиваться ежедневнооперация.Возможно, вы захотите найти лучший способ выполнения полнотекстового поиска, будь то использование библиотеки или создание таблицы перекрестных ссылок с ключевыми словами, поддерживаемой триггерами.

0 голосов
/ 04 марта 2010

Вы можете попробовать это http://www.sphinxsearch.com/

Вам нужен выделенный сервер для запуска этой вещи, но если он у вас есть, sphinx легко решит вашу проблему, а ваши запросы не загрузят базу данных.

...