Вопрос

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

В 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 для поиска по имени и/или фамилии?Я хотел бы иметь возможность искать «Смит» только по имени?

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top