我正在尝试使用 mysql 编写一个搜索应用程序,并且我有以下架构:
Table --> Fields
word_index --> word_id,word
index_group --> word_id,file_id
file_info --> file_id,file_name
想象一个文件 foo.txt
包含单词 abc
那么如果有人搜索单词 "abc"
SELECT file_name FROM file_info WHERE file_id IN
(SELECT file_id FROM index_group WHERE word_id IN
(SELECT word_id FROM word_index WHERE word='abc'))
显示foo.txt
现在,当我在多个文件中搜索多个单词时,我会采取什么方法。我能做的一件事是拆分查询并对所有 n 个结果应用 INTERSECT 。但MySQL不支持INTERSECT。我的方法应该是什么?
编辑
我将附上一个来自 wiki 的示例来演示我想要的内容
T[0] = "it is what it is"
T[1] = "what is it"
T[2] = "it is a banana"
我们有以下倒排文件索引(其中设置符号括号中的整数指的是文本符号的索引(或键),T[0]、T[1] 等):
"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}
对术语“what”、“is”和“it”进行术语搜索将给出集合 {0,1} intersect {0,1,2} intersect {0,1,2} = {0,1 }.
但是,将来当 3 个单词中有 2 个同时出现时,我可能需要执行 TF-IDF。所以我想抽象出 3 个结果,然后将它们相交。
最佳答案
因此,您只想获取包含所有请求的单词的文件。要实现这一目标,请选择包含一个或多个这些单词的所有文件,然后计算您获得的匹配数。如果您查找三个单词并找到具有三个不同匹配项的文件,那么您就找到了所有单词。
SELECT file_name
FROM file_info
WHERE file_id IN
(
SELECT file_id
FROM index_group
WHERE word_id IN
(
SELECT word_id
FROM word_index
WHERE word IN ('abc','def','ghi')
)
GROUP BY file_id
HAVING COUNT(DISTINCT word_id) = 3 -- all three words
);
关于mysql - mysql中n个查询相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24567463/