如果您要对“1962 Chevy Nova 敞篷车”[原文如此] 进行标记,您最终会得到四个足够重要或有趣的标记。如果您正在跟踪您的语言中所有可能的单词,那么您将拥有每个单词的索引。
另一方面,你有你的搜索词。在每种情况下,您都对有趣的单词进行了标记和索引。每一个都可以看作是一对两个令牌索引。
那么,如果您接受输入并寻找匹配的搜索词,您会问哪些搜索词具有输入的任何词?
因为我本质上是一个数据库专家,所以我可以想象像这样创建令牌列表:
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 Chevy Nova convertable”转换为标记(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”匹配两个标记并且是最佳匹配,当然,它是。