Я работаю над полем автозаполнения с поддержкой sphinx (php), который просматривает пользователей. Я сталкиваюсь с некоторыми странными ситуациями, когда определенные входные данные, которые должны возвращать совпадения, этого не делают.
Поля в моем индексе пользователей:
'fullname',
'username',
'address',
'phone',
'email'
Общая информация о конфигурации:
charset_type = utf-8
enable_star = 1
min_infix_len = 3
ignore_chars = U+20
Мой текущий запрос настроен следующим образом:
$search = preg_replace('/([^\s]{3,})/', '*$1*', preg_replace('/[^a-z ]/i', '', $search));
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
$sphinx->SetSortMode(SPH_SORT_RELEVANCE);
$matches = $sphinx->Query($search . ' @email company.com', 'users');
Проблема связана со следующими параметрами поиска:
John -> returns list of all Johns (GOOD!)
John S -> returns nothing (BAD!)
John St -> returns all John St*'s (GOOD!)
Аналогично:
Ben -> returns all Ben's (GOOD!)
Ben M -> returns nothing (BAD!)
Ben Ma -> returns nothing (BAD!)
Ben Mar -> returns user with Ben Mar*'s (GOOD!)
Изначально я думал, что проблема в том, что имя и фамилия были в разных полях индекса, но теперь, когда я объединил их в поле полного имени, я все еще получаю точно такие же результаты.
В настоящее время (через вышеупомянутый preg_replace) я заключаю каждое слово, введенное в *. Я также попытался просто обернуть всю строку с *,
$search = '*' . $search . '*';
но с менее точными результатами. Я пробовал другие режимы поиска, кроме extended2, но не повезло. (Это только ухудшается) Я добавил опцию, чтобы игнорировать пробелы в конфиге, надеясь, что он выберет такие вещи, как «Джон С», но все равно не повезло.
В основном, я бы хотел, чтобы люди могли найти пользователя, набрав «Имя» + «Фамилия». Это обычный способ, которым люди пытаются искать имена пользователей, и в настоящее время они не могут.
Любая помощь очень ценится. Спасибо!
EDIT:
В большом поиске я нашел это: http://sphinxsearch.com/forum/view.html?id=5757
Кажется, могут быть некоторые ошибки / несоответствия при поиске с пробелами. Но если у кого-то есть идеи, пожалуйста, прокомментируйте. Спасибо!