【问题标题】:intersecting n number of queries in mysql在mysql中相交n个查询
【发布时间】:2014-07-04 05:47:36
【问题描述】:

我正在尝试使用 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 个结果,然后将它们相交。

【问题讨论】:

  • WHERE word IN('abc','cdg')?
  • 这在两个单词都在同一个文件中时有效。另一种情况呢?我将附上一个来自wiki的例子
  • 不,Sarkar,当两个单词都在同一个文件中时,这不起作用,否则不起作用。 Arion 完全错了。您将获得包含至少一个单词的所有文件。可以说是联合而不是交集。

标签: mysql sql search select full-text-search


【解决方案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
);

【讨论】:

  • 我的回答和你问的有什么不同?您正在寻找“what”、“is”和“it”,得到三个匹配的文件,但由于只有两个包含所有单词,所以having 子句删除了一个文件。这不是您要问的内容以及我的查询内容吗?如果以后两个词就足够了,则将 HAVING 子句更改为HAVING COUNT(DISTINCT word_id) >= 2
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2022-01-13
相关资源
最近更新 更多