mysql - mysql中n个查询相交

标签 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} 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/

相关文章:

javascript - javascript中的数组搜索

mysql - 按子模型属性的乘积之和分组

mysql - 如何在 MySQL 中创建递归存储过程?

sql - 如何查看特定列中是否有多行具有相同的值?

python - 查找子字符串在字符串中连续出现的次数最多

CakePHP 在 2 个日期记录之间搜索

php - mysql使用计数选择2个随机行

mysql - 在sql中的连接查询中选择另一个表

MySQL Join 和 COUNT(*) 查询

php - PDO查询返回0