0

我目前有两张桌子:

搜索匹配:

match_id (int) <-- primary key
parent_id (int) <-- foreign-key
word_id (int) <-- foreign-key (to a table filled with words that are unique and have an id)
pos (int) <-- the position of the word in the block of text it comes from

search_words:(更新)

word_id (int) <-- primary key
word (varchar ...) <-- the word

(我用的是innodb,我的主机不会升级mysql,所以全文出)

我希望我的用户能够使用“搜索”。这样他们就可以搜索“foo bar”。

我已经想到了几种方法,但最不密集的似乎是添加另一列:

next_pos (int)

然后我可以做

(SELECT * FROM table WHERE word_id='foo') as foo
INNER JOIN (SELECT * FROM table WHERE word_id='bar') AS bar 
ON (
  foo.parent_id=bar.parent_id AND
  foo.next_pos=bar.next_pos
)

它的代价是为第一个单词之外的每个单词存储一个额外的列和一个内部连接,但它是迄今为止我想出的最佳选择。(之前的想法是减少一列,但需要在 ON 块内进行加法操作,我认为随着网站的增长,这可能太昂贵了。

这是我最好的选择,还是有其他选择?我仍然只是在舞台上玩,所以现在是时候做出改变了。


更新1:

我现在正在考虑使用关键字表来缩小搜索范围,然后使用 like 代替多个连接,因为这可能更快,并且大大消除了连接的需要。对我的整个数据库进行点赞是没有效率的。

4

2 回答 2

0

我真的不明白你为什么要做所有这些手工工作。有一些工具可以简化它。从我读到的内容来看,您想要做的与全文搜索有关。您不需要自己构建索引。

您是否考虑过使用 SolR 之类的东西?只要您创建索引,它就适用于任何类型的数据库。

于 2013-04-16T01:31:55.847 回答
-1

我不知道您将如何使用当前设置进行搜索。如果如您所说,您有一个仅包含文本块中唯一单词的表,您希望如何将这个唯一单词列表与完整内容中的实际单词位置相关联?例如,假设原始内容如下所示:

some text with foo and also with foo bar

你的独特词表会是这样吗?

word_id   word
--------------
1         some
2         text
3         with
4         foo
5         and
6         also
7         bar

如果是这样,您将如何找到foobar作为相邻记录?

我假设您的数据库在某处也有完整的内容,那么为什么不直接使用搜索内容LIKE呢?

于 2013-04-15T23:57:58.673 回答