2012-04-05 51 views
2

有很多軟件會接收一個搜索字符串並找到數據庫中包含它的所有文本(MySQL的WHERE MATCH('searchterm', string_column),Google等),但有沒有一種好的算法可以用於其他方式?給出一個搜索項的列表,我如何判斷我的字符串包含哪些字符?

說我有搜索詞的列表:

豐田普銳斯,豐田塔科馬,本田思域,雪佛蘭新星,雪佛蘭Volt

而且我有一個字符串,如:

1962 Chevy Nova convertable

I那裏有一個很好的算法,我可以把列表和字符串放進去,並且得到Chevy Nova

如果它們都很容易標記,我可以標記它們並進行內部連接,但是我對無法辨別輸入字符串的哪一部分是「重要」部分的情況感興趣。

回答

3

如果您要標記「1962 Chevy Nova convertable」[原文如此],您最終將得到四個足夠重要或足以引起關注的標記。如果您要跟蹤您的語言中所有可能的單詞,那麼您將爲每個單詞指定一個索引。

另一方面,你有你的搜索條件。在每種情況下,您都會對有趣的單詞進行標記和索引。這些中的每一個都可以作爲一對兩個令牌索引。

那麼如果你接受你的輸入並尋找匹配的搜索詞,你會問哪個搜索詞有任何輸入詞?

,因爲我在心臟數據庫的傢伙,我能想象創建令牌列表,像這樣:

CREATE TABLE aa_tokens (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
    word VARCHAR(40) NOT NULL 
); 

insert into aa_tokens (word) values 
    ('1962'),   -- 1 
    ('Chevy'),   -- 2 
    ('Civic'),   -- 3 
    ('Honda'),   -- 4 
    ('Nova'),   -- 5 
    ('Prius'),   -- 6 
    ('Tacoma'),   -- 7 
    ('Toyota'),   -- 8 
    ('Volt'),   -- 9 
    ('convertable'); -- 10 

和搜索的表,這樣每個人都可以有一個id:

CREATE TABLE aa_search (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
    text VARCHAR(255) NOT NULL 
); 

insert into aa_search (text) values 
    ('Toyota Prius'), -- 1 
    ('Toyota Tacoma'), -- 2 
    ('Honda Civic'), -- 3 
    ('Chevy Nova'),  -- 4 
    ('Chevy Volt');  -- 5 

然後表結合搜索和標記:

CREATE TABLE aa_searchToks (
    search INT NOT NULL, 
    token INT NOT NULL 
); 

insert into aa_searchToks (search, token) values 
    (1, 8), 
    (1, 6), 
    (2, 8), 
    (2, 7), 
    (3, 4), 
    (3, 3), 
    (4, 2), 
    (4, 5), 
    (5, 2), 
    (5, 9); 
現在如果我們把輸入字符串「1962年CHEV

ÿ諾瓦可轉換」,把它變成令牌(1,2,5,10),我們可以進行查詢,着眼於所述搜索項的標記:

select search, count(*) from aa_searchToks 
    where token in (1, 2, 5, 10) group by search; 

其結果是:

+--------+----------+ 
| search | count(*) | 
+--------+----------+ 
|  4 |  2 | 
|  5 |  1 | 
+--------+----------+ 

或不同查詢一點點:

select search, (select text from aa_search s where st.search = s.id) as text, 
    count(*) from aa_searchToks st where token in (1, 2, 5, 10) group by search; 

導致:

+--------+------------+----------+ 
| search | text  | count(*) | 
+--------+------------+----------+ 
|  4 | Chevy Nova |  2 | 
|  5 | Chevy Volt |  1 | 
+--------+------------+----------+ 

我們可以看到「Chevy Nova」匹配兩個標記,並且是最好的匹配,當然這是。

相關問題