Как мне найти часть столбца? - PullRequest
1 голос
/ 08 августа 2009

У меня есть таблица MySQL, содержащая 40 миллионов записей, которая заполняется процессом, который я не могу контролировать. Данные добавляются только один раз в месяц. Эта таблица должна быть доступна для поиска по столбцу Имя. Но столбец имени содержит полное имя в формате «Last First Middle».

В sphinx.conf у меня есть

sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname
FROM table1

Как использовать поиск sphinx для поиска по имени и / или фамилии? Я хотел бы иметь возможность искать «Смит» только по имени?

Ответы [ 4 ]

4 голосов
/ 08 августа 2009

Функции для каждой строки в запросах SQL всегда плохая идея для таблиц, которые могут стать большими. Если вы хотите выполнить поиск по части столбца, он должен быть извлечен в отдельный столбец и проиндексирован.

Я бы предложил, если у вас есть власть над схемой (в отличие от процесса заполнения), вставить новые столбцы с именами OwnersFirstName и OwnersLastName вместе с триггером обновления / вставки, который извлекает соответствующую информацию из OwnersName и заполняет новые столбцы соответствующим образом .

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

Тогда ваши запросы становятся ослепительно быстрыми. И да, это нарушает 3NF, но большинство людей не понимают, что это нормально делать по соображениям производительности, при условии, что вы понимаете последствия. И так как новые столбцы управляются триггерами, дублирование данных, которое могло бы вызвать беспокойство, является «чистым».

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

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

1 голос
/ 11 августа 2009

Судя по другим ответам, возможно, я что-то упустил ... но чтобы ограничить поиск в Sphinx определенным полем, убедитесь, что вы используете расширенный (или extended2) режим соответствия, а затем используйте следующий запрос строка: @firstname Smith.

0 голосов
/ 08 августа 2009

Это труднопреодолимая проблема, поскольку полные имена могут содержать префиксы, суффиксы, отчества, без имен, составные имена и фамилии с дефисами и без них и т. Д. Нет разумного способа сделать это со 100% надежностью

0 голосов
/ 08 августа 2009

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

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

...