【发布时间】: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