我有一个MySQL表,其中对1000篇帖子进行了索引
第一列包含关键字,第二列包含出现次数,在第三列中有一个数组,其中每个索引包含一个长度为3的数组,这样第一个索引代表帖子的ID,第二个出现次数该帖子中的第3个索引包含一个包含关键字的行号数组。
现在,我想创建一个搜索引擎,用户可以在其中基于关键字搜索帖子。最基本的解决方案是从mysql查询中获取每个关键字的所有结果,然后使用javascript(因为我使用的是Node)找到所有常见的帖子ID。
我知道必须有提高效率的方法。我考虑使用MongoDB,但不确定是否可以使用。 而且我也不能使用弹性搜索。
答案 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,...]