私は、多くのデータベースと同様に、経歴情報を含むテーブルを持つ 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
この機能についてはよくわかりません。たとえば、私の開発データでは、「Jonathan Peter Jason Smith」が一番上に表示されていますが、「Jane Margaret Simpson」は「John Terrance Smith」と同じレベルにあります。
実生活では、名前の途中でチャンクを検索することは決してないため、前のワイルドカードを削除すると、結果を低下させることなくパフォーマンスが向上する可能性があると考えています。しかし、そうでなければ、私はアイデアを受け入れます... このシナリオは、うんざりして実装されたに違いありません! 私が今やっている/考えていることに対して、より良いアプローチを提案できる人はいますか?
ありがとう :)