У меня есть база данных Oracle, которая, как и многие, имеет таблицу, содержащую биографическую информацию. На этом я хотел бы искать по имени "естественным" способом.
В таблице есть поля forename
и surname
, и в настоящее время я использую что-то вроде этого:
select id, forename, surname
from mytable
where upper(forename) like '%JOHN%'
and upper(surname) like '%SMITH%';
Это работает, но может быть очень медленным, потому что индексы в этой таблице, очевидно, не могут учитывать предыдущий шаблон. Кроме того, пользователи обычно будут искать людей на основе того, что они говорят им по телефону, включая огромное количество неанглийских имен, поэтому было бы неплохо также провести фонетический анализ.
Таким образом, я экспериментировал с 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, а также полные текстовые индексы, поэтому он должен быть немного более эффективным. (Хотя, мои анекдотические результаты показывают, что это довольно медленно!) Единственные опасения, которые у меня возникают по этому поводу:
-
Во-первых, текстовые индексы необходимо обновлять каким-либо значимым образом. Использование
on commit
будет слишком медленным и может мешать тому, как внешнее программное обеспечение, которое находится вне моего контроля, взаимодействует с базой данных; поэтому требуется некоторое размышление о... -
Результаты, возвращаемые Oracle, не совсем сортируются по-разному; Я не уверен в этой функции
score
. Например, мои данные о развитии показывают "Джонатан Питер Джейсон Смит" наверху - отлично, но также "Джейн Маргарет Симпсон" на том же уровне, что и "Джон Терренс Смит"
Я думаю, что удаление предыдущего шаблона может повысить производительность без ухудшения результатов, так как в реальной жизни вы никогда не будете искать кусок в середине имени. Однако, в остальном, я открыт для идей... Этот сценарий должен быть реализован ad nauseam! Может ли кто-нибудь предложить лучший подход к тому, что я делаю/рассматриваю сейчас?
Спасибо:)