2

WHERE MATCH('searchterm', string_column)検索文字列を取得し、それを含むデータベース (MySQLや Google など)内のすべてのテキストを検索するソフトウェアはたくさんありますが、別の方法で実行するための適切なアルゴリズムはありますか?

検索語のリストがあるとします。

トヨタ プリウス、トヨタ タコマ、ホンダ シビック、シボレー ノバ、シボレー ボルト

そして、次のような文字列があります。

1962 シボレー ノバ コンバーチブル

リストと文字列を入れChevy Novaて取り出すことができる良いアルゴリズムはありますか?

それらがすべて簡単にトークン化されている場合は、それらをトークン化して内部結合を実行できますが、入力文字列のどの部分が「重要な」部分であるかがわからない場合に興味があります。

4

1 に答える 1

3

「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 つのトークンに一致し、ベスト マッチであることがわかります。もちろん、これは一致しています。

于 2012-04-07T17:13:35.463 に答える