实现查找/查找下一个算法

dan*_*car 24 sql database postgresql

我有一个数据库表(mysql/pgsql),格式如下:

id|text
 1| the cat is black
 2| a cat is a cat
 3| a dog
Run Code Online (Sandbox Code Playgroud)

我需要选择包含单词第n个匹配的行:

例如:"选择单词cat的第3个匹配,即2号条目." 结果:第3个单词是cat的结果的第2行

我能找到的唯一解决方案是搜索所有具有文本cat的条目,将它们加载到内存中并通过计算它们来查找匹配项.但这对大量比赛(> 100万)来说效率不高.

你会如何以有效的方式处理这个问题?你有什么可以直接在数据库中做的吗?也许使用像lucene这样的其他技术?

更新:在内存中有100万个字符串可能不是一个大问题,但应用程序的期望是有1k到50k活跃用户可能同时执行此操作.

gip*_*psy 11

考虑使用以下结构创建另一个表

Table : index_table
columns : 
         index_id , word, occurrence, id(foreign key to your original table)
Run Code Online (Sandbox Code Playgroud)

做一次索引过程如下:

对原始表中的每个条目进行迭代将文本拆分为单词,并且对于新表中的每个单词查找,如果不存在,则插入一个出现设置为1的新条目.如果存在,则插入具有occurrence =现有出现的新条目+1

完成此操作后,您的选择变得非常简单.例如,对于第三场比赛的猫将是

SELECT * 
FROM original_table o, index_table idx
WHERE idx.word = 'cat' 
  AND idx.occurrence = 3 
  AND o.id = idx.id
Run Code Online (Sandbox Code Playgroud)


Cra*_*lus 1

您将如何有效地处理这个问题?有什么技巧可以直接在数据库中执行吗?

您没有具体说明您可能有哪些其他限制/要求,或者您的定义是什么

大量的比赛。

作为一般性答案,我会说在数据库中进行字符串操作并不是一种有效的方法。
它太慢了,并且给您的数据库(通常是共享资源)带来了很多工作。
IMO 你应该以编程方式执行此操作。
实现此目的的一种方法是将元数据保存在另一个表中,即包含文本 cat 和句子中的 where 的行的索引。
您可以查询此元表,以便找出要从主表中查询的行。
这个额外的表比搜索您定义的表更有效,因为带有LIKEon 后缀的查询不能使用索引,您最终将进行串行扫描,这将导致性能非常低