从索引表高效查询

时间:2019-03-08 17:17:09

标签: mysql node.js mongodb indexing

我有一个MySQL表,其中对1000篇帖子进行了索引

enter image description here

第一列包含关键字,第二列包含出现次数,在第三列中有一个数组,其中每个索引包含一个长度为3的数组,这样第一个索引代表帖子的ID,第二个出现次数该帖子中的第3个索引包含一个包含关键字的行号数组。

现在,我想创建一个搜索引擎,用户可以在其中基于关键字搜索帖子。最基本的解决方案是从mysql查询中获取每个关键字的所有结果,然后使用javascript(因为我使用的是Node)找到所有常见的帖子ID。

我知道必须有提高效率的方法。我考虑使用MongoDB,但不确定是否可以使用。 而且我也不能使用弹性搜索。

2 个答案:

答案 0 :(得分:1)

为进行标准化,您可能需要至少两个表。

一个仅用于保留关键字(以及一个易于快速引用的keyword_id值)。

用于“索引”的第二个表,保持不变(关键字ID,邮政ID,行号)。当在此索引表上进行简单的“计数”查询可以产生相同的结果而无需与字符串数据保持同步时,保存计数的字段的存在将变得多余。

然后要查找带有关键字的帖子,您可以像这样进行查询:

SELECT i.post_id, COUNT(DISTINCT i.keyword_id) AS keywordsUsed 
FROM keywords AS k
INNER JOIN keywords_index AS i ON k.keyword_id = i.keyword_id
WHERE k.keyword IN ( 'your', 'list', 'of', 'keywords')
GROUP BY i.post_id
ORDER BY keywordsUsed DESC
;

或这个

SELECT post_id, COUNT(DISTINCT keyword_id) AS keywordsUsed 
FROM keywords_index 
WHERE keyword_id IN (
   SELECT keyword_id 
   FROM keywords 
   WHERE keyword IN ( 'your', 'list', 'of', 'keywords')
)
GROUP BY post_id
ORDER BY keywordsUsed DESC
;

另一个需要牢记的事情是,尽管该表看起来更大(有更多行),但它可能会占用更少的实际空间(并因此而更快地访问):

字符串[[113, 1, [822]], [199, 1, [11592]],[267, 1, [5293至少为50个字节(假定为单字节字符集),不计算字符串本身的长度说明符。即使删除计数值以及相关的逗号和空格也只能将数据减少9个字节。

113, 822 199, 11592 267, 5293 假设ID值使用INT,则为24个字节。

答案 1 :(得分:0)

选择查询应如下所示:

Select {third column name} from {table name} where {first column name} like %?%

因此,如果您通过agree,则应该获得[[2,1,[673], [7,3,[303, 2863, 2866],[9,2,[...]]

这应该返回您的数组,您应该可以map()结束

如果您想要第一个索引...

{array}.map((subArray) => subArray[0]); //returns an array of the first index

这将返回[2,7,9]

如果您尝试获取第三个索引并将其合并,则应该能够进行foreach()concat()

let sample = [];
{array}.forEach((subArray) => { sample = sample.concat(subArray);});

这将返回`[[673,303,2863,2866,...]