在mysql中相交n个查询

在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 现在,当我在多个文件中搜索多个单词时,我应该采取什么方法。我可以

我正在尝试使用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

现在,当我在多个文件中搜索多个单词时,我应该采取什么方法。我可以做的一件事是拆分查询并对所有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
);