2013-04-15 108 views
0

我目前有兩個表:有序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:

現在我正在考慮使用關鍵詞表來縮小我的搜索,然後用就像那樣,而不是多個連接,因爲這可能會更快,並且極大地消除了連接的需要。它只是不會有效地做一個像在我的整個數據庫上。

回答

-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內容搜索?

+0

唯一值表只是一個主自動遞增鍵(word_id)與另一個包含文本的列(單詞)。{1:some,2:text,3:with,4:foo,5:and,6:also,7:bar}單詞不重複。我擔心可能太貴了。 – Kirk

+0

@Kirk但是,如果您需要搜索全部內容的有意義的子字符串,則無法僅通過內容中所有世界的字典來進行此操作,除非您知道該字詞不會在該內容中重複。 –

+0

有兩個表...一個是字典。另一個包含字典的引用,其文本中的單詞位置來自(pos) – Kirk

0

我真的不明白你爲什麼要做所有這些手工工作。那裏有很多工具可以簡化它。從我讀到的內容看,你想要做的是與全文搜索有關。您不需要自己構建索引。

你有沒有考慮過使用類似SolR的東西?只要你創建一個索引,它就可以很好地處理任何類型的數據庫。

+0

不幸的是,我的主機不會讓我用我當前的包進行此操作。 – Kirk