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)
您将如何有效地处理这个问题?有什么技巧可以直接在数据库中执行吗?
您没有具体说明您可能有哪些其他限制/要求,或者您的定义是什么
大量的比赛。
作为一般性答案,我会说在数据库中进行字符串操作并不是一种有效的方法。
它太慢了,并且给您的数据库(通常是共享资源)带来了很多工作。
IMO 你应该以编程方式执行此操作。
实现此目的的一种方法是将元数据保存在另一个表中,即包含文本 cat 和句子中的 where 的行的索引。
您可以查询此元表,以便找出要从主表中查询的行。
这个额外的表比搜索您定义的表更有效,因为带有LIKEon 后缀的查询不能使用索引,您最终将进行串行扫描,这将导致性能非常低
| 归档时间: |
|
| 查看次数: |
777 次 |
| 最近记录: |