如果您要標記「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」匹配兩個標記,並且是最好的匹配,當然這是。