Я пытаюсь построить запрос для поиска по полнотекстовому индексу в MySQL - PullRequest
1 голос
/ 31 мая 2010

Схема таблицы довольно проста. У меня есть дочерняя таблица, в которой хранится информация о клиенте, такая как адрес и номер телефона. Это столбцы user_id, fieldname, fieldvalue и fieldname. Таким образом, каждая строка будет содержать один элемент, такой как номер телефона, адрес или адрес электронной почты. Это позволяет неограниченное количество каждого типа информации для каждого клиента.

Люди на телефонах должны быстро найти этих клиентов, когда они звонят в наш колл-центр. Я экспериментировал с использованием LIKE%, и сейчас я работаю с индексом FULLTEXT. Мои запросы работают, но я хочу сделать их более полезными, потому что если кто-то ищет телефонный код, такой как 805, который вызовет много людей, а затем добавит имя Билл, чтобы сузить его, «805 Билл». Это покажет КАЖДОМУ клиенту, у которого есть 805 ИЛИ Билл. Я хочу, чтобы он выполнял И выполнял поиск по нескольким строкам внутри каждого клиента.

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

SELECT DISTINCT `user_id` FROM `user_details` WHERE MATCH (`fieldvalue`) AGAINST ('805 Bill')

Опять же, я хочу выполнить приведенный выше запрос для групп строк, принадлежащих одному пользователю, но эти пользователи должны соответствовать поисковым ключевым словам. Что мне делать?

Ответы [ 2 ]

0 голосов
/ 31 мая 2010

Вы пытались использовать BOOLEAN MODE поисковых запросов?

SELECT `user_id` FROM `user_details` 
WHERE MATCH (`fieldvalue`) AGAINST ('+805 +Bill' IN BOOLEAN MODE)

Это означает, что вы должны манипулировать поисковым запросом, который вводит пользователь. Вы не можете просто передать его в свой запрос дословно; Вы должны добавить + символов и т. д.


Ваш комментарий: любой предикат SQL оценивается в контексте только одной строки за раз. Для сравнения строк можно использовать самосоединение:

SELECT `user_id` FROM `user_details` u1 JOIN `user_details` u2 USING (`user_id`)
WHERE MATCH (u1.`fieldvalue`) AGAINST ('805 Bill' IN BOOLEAN MODE)
  AND MATCH (u2.`fieldvalue`) AGAINST ('805 Bill' IN BOOLEAN MODE)

PS: я удалил DISTINCT, поскольку в этом запросе он не используется и может только снизить производительность.

0 голосов
/ 31 мая 2010

Мысли: можете ли вы иметь два индекса FULLTEXT и выполнять ГДЕ МАТЧ (бла) и МАТЧ (бла)?

Конечно, вы должны хранить коды регионов в отдельном поле.

MySQL также поддерживает подвыборы, поэтому вам не нужно делать два запроса, чтобы получить результат.

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