我目前有两张桌子:
search_matches:
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:
我现在正在考虑使用关键字表来缩小我的搜索范围,然后使用类似于此而不是多个连接,因为这可能更快,并且极大地消除了对连接的需求。在我的整个数据库上做同样的事情是没有用的。
答案 0 :(得分:0)
我真的不明白你为什么要做所有这些手工工作。那里有工具可以简单地使用它。从我读到的你想做的事与全文搜索有关。您不需要自己构建索引。
您是否考虑使用像SolR这样的东西?只要您创建索引,它就适用于任何类型的数据库。
答案 1 :(得分:-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
如果是这样,您如何找到foo
和bar
作为相邻记录?
我认为您的数据库也有完整的内容,所以为什么不使用LIKE
搜索内容?