在mysql中交叉n个查询

时间:2014-07-04 05:47:36

标签: 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"

,我基本上会这样做
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个结果,然后将它们相交。

1 个答案:

答案 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
);