我在数据库中有数千个关键字(每个关键字中包含一个或多个单词)的有限列表.我想有效地找到哪些关键字在给定的输入文本中,而不必逐个测试每个关键字(全表扫描).允许匹配文本中的一些拼写错误的单词会更好但不是必需的.任何算法/文章建议来解决这个问题?
我不知道您使用的是哪个数据库,但知道如果是 Oracle,您应该有权访问Oracle Text功能(或者您可以要求 DBA 启用它)。借助附加功能(例如CONTAINS
Oracle Text 索引)和正确使用 Oracle Text 索引,您可以准确地实现您想要的效果,甚至可以查找“拼写错误”的单词。这是通过与计算两个字符串之间的编辑距离的CONTAINS
函数结合来完成的。在 Oracle Text 中,这个函数是。FUZZY
此Oracle 文档中有一个适合您的完美示例。
我对其他类型的数据库了解不够,但我很确定主要供应商确实有用于搜索文本的东西。只需快速谷歌搜索即可,其中有全文搜索:
无论如何,使用内置的 DBMS 函数/过程比创建自己的自定义函数甚至使用编程语言进行搜索要快得多(尽管数千个关键字并不算多)
编辑:再次阅读你的问题和迪恩·哈丁的回答后,我觉得我没有正确回答这个问题。CONTAINS
使用 Oracle Text,您可以使用该函数MATCHES
(参见第 4.1.3 段)来代替该函数,该函数的作用正是:针对某些文本查询存储在表中的关键字列表,并返回找到的关键字的 id。我将复制下面文档中找到的示例(添加了我自己的注释):
create table queries (
query_id number,
query_string varchar2(80)
);
// Here we populate the table with the keywords
insert into queries values (1, 'oracle');
insert into queries values (2, 'larry or ellison');
insert into queries values (3, 'oracle and text');
insert into queries values (4, 'market share');
create index queryx on queries(query_string)
indextype is ctxsys.ctxrule;
// This query will return the ids of the matched keywords
select query_id from queries
where matches(query_string,
'Oracle announced that its market share in databases
increased over the last year.')>0
Run Code Online (Sandbox Code Playgroud)
我希望它比我的第一次尝试更有帮助。
Edit2:只是补充一点,因为您使用的是域索引,所以您不使用此方法执行全表扫描。