我目前有兩個表:有序MySql的關鍵字搜索
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升級,所以全文超出)
我希望能爲我的用戶使用搜索」,使他們能夠SE 「foo吧」的拱門。
我認爲這樣做的幾種方法,但也是最密集的似乎是增加另一列:
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:
現在我正在考慮使用關鍵詞表來縮小我的搜索,然後用就像那樣,而不是多個連接,因爲這可能會更快,並且極大地消除了連接的需要。它只是不會有效地做一個像在我的整個數據庫上。
唯一值表只是一個主自動遞增鍵(word_id)與另一個包含文本的列(單詞)。{1:some,2:text,3:with,4:foo,5:and,6:also,7:bar}單詞不重複。我擔心可能太貴了。 – Kirk
@Kirk但是,如果您需要搜索全部內容的有意義的子字符串,則無法僅通過內容中所有世界的字典來進行此操作,除非您知道該字詞不會在該內容中重複。 –
有兩個表...一個是字典。另一個包含字典的引用,其文本中的單詞位置來自(pos) – Kirk