我正在尝试使用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}交叉{0,1,2}交叉{0,1,2} = {0,1 }。
但是将来我可能不得不为3个单词中的2个一起出现的情况做TF-IDF。所以我想抽象出3个结果,然后将它们相交。
答案 0 :(得分:2)
因此,您只想获得包含所有请求单词的文件。要实现此目的,请选择包含一个或多个单词的所有文件,然后计算您获得的匹配项数。如果您查找三个单词并找到包含三个不同匹配项的文件,那么您找到了所有单词。
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
);