Предложения по запросу в базе данных для имен

У меня есть база данных Oracle, в которой, как и во многих других, есть таблица, содержащая биографические данные. По которым я хотел бы искать по имени "естественным" способом.

В таблице есть поля имя и фамилия , и в настоящее время я использую что-то вроде этого:

select id, forename, surname
from   mytable
where  upper(forename) like '%JOHN%'
and    upper(surname) like '%SMITH%';

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

Таким образом, я экспериментировал с Oracle Text:

create index forenameFTX on mytable(forename) indextype is ctxsys.context;
create index surnameFTX on mytable(surname) indextype is ctxsys.context;

select   score(1)+score(2) relevance,
         id,
         forename,
         surname
from     mytable
where    contains(forename,'!%john%',1) > 0
and      contains(surname,'!%smith%',2) > 0
order by relevance desc;

У этого есть преимущество использования алгоритма Soundex, а также полнотекстовых индексов, поэтому он должен быть немного более эффективным.(Хотя мои анекдотические результаты показывают, что это происходит довольно медленно!) Единственные опасения, которые у меня есть по этому поводу:

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

  • Результаты, возвращаемые Oracle, не совсем естественно отсортированы; Я не совсем уверен в этой функции score . Например, мои данные о разработке показывают вверху «Джонатан Питер Джейсон Смит» - хорошо - но также «Джейн Маргарет Симпсон» на том же уровне, что и «Джон Терренс Смит»

. Я думаю, что удаление предыдущего подстановочный знак может улучшить производительность без ухудшения результатов, поскольку в реальной жизни вы никогда не будете искать фрагмент в середине имени. Однако в остальном я открыт для идей ... Этот сценарий, должно быть, был реализован до тошноты! Может ли кто-нибудь предложить лучший подход к тому, что я делаю / рассматриваю сейчас?

Спасибо :)

12
задан Xophmeister 30 September 2011 в 15:41
поделиться