「1962 Chevy Nova コンバーチブル」[原文のまま] をトークン化する場合、すべて重要または関心を引くのに十分な 4 つのトークンで終わることになります。自分の言語で考えられるすべての単語を追跡している場合は、それらの単語ごとにインデックスが作成されます。
一方で、検索用語があります。それぞれのケースで、興味深い単語をトークン化し、インデックスを作成しました。これらはそれぞれ、2 つのトークン インデックスのペアと考えることができます。
次に、入力を取得して一致する検索語を探すと、どの検索語に入力の単語が含まれているかを尋ねることになります。
私は根っからのデータベースマニアなので、次のようにトークン リストを作成することを想像できます。
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」が 2 つのトークンに一致し、ベスト マッチであることがわかります。もちろん、これは一致しています。