在mysql中相交n个查询
我正在尝试使用mysql编写搜索应用程序,我有以下模式:在mysql中相交n个查询,mysql,sql,search,select,full-text-search,Mysql,Sql,Search,Select,Full Text Search,我正在尝试使用mysql编写搜索应用程序,我有以下模式: Table --> Fields word_index --> word_id,word index_group --> word_id,file_id file_info --> file_id,file_name 想象一个文件foo.txt包含单词abc 因此,如果有人搜索“abc”这个词,我基本上会做什么 其中显示foo.txt 现在,当我在多个文件中搜索多个单词时,我应该采取什么方法。我可以
Table --> Fields
word_index --> word_id,word
index_group --> word_id,file_id
file_info --> file_id,file_name
想象一个文件foo.txt
包含单词abc
因此,如果有人搜索“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]等):
对术语“what”、“is”和“it”的术语搜索将给出集合{0,1}intersect{0,1,2}intersect{0,1,2}={0,1}
然而,在未来,当三个单词中有两个出现在一起时,我可能不得不使用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
);
单词在哪里('abc','cdg')
?当两个单词都在同一个文件中时,这种方法就起作用了。另一个案子呢?我将附上一个来自wikiNo,Sarkar的例子,如果两个单词都在同一个文件中,这将不起作用。阿里昂完全错了;您将获得至少包含一个单词的所有文件。可以这么说,是一个联合而不是一个交叉点。我的回答和你的问题有什么不同?您正在查找“what”、“is”和“it”,得到三个匹配的文件,但由于只有两个文件包含所有单词,having子句将删除一个文件。这不就是你要问的吗?我的问题是什么?如果将来两个单词足够,那么将HAVING子句更改为HAVING COUNT(DISTINCT word_id)>=2
。
"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}
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
);