3

こんばんは、

小さな検索アルゴリズムを構築しようとしているときに、小さな問題に直面しています。

ビデオ ゲーム名とソフトウェア名を含むデータベース テーブルがあります。ここで、他のサーバーで xml ファイルを取得して解析することにより、新しいオファーを追加したいと考えています。問題は次のとおりです。

オファー名がデータベースに保存されている製品名と 100% 一致しない場合でも機能するように、製品名の文字列を比較するにはどうすればよいですか?

例として、私は現在、この PHP + SQL コードを使用して文字列を比較しています。

$query_GID = "select ID,game from gkn_catalog where game like '%$batch_name%' or meta like '%$batch_name%' ";

現在、like演算子を 2 つのワイルドカードと組み合わせて使用​​して、オファー名 ( batch_name ) をデータベース内の名前 ( game ) と比較しています。


この方法はあまりフェイルセーフではないか、何と呼んでもよいので、これをどのように改善できるかを知りたいのですが、何が起こるかは次のとおりです。

データベースがゲームのタイトルを次のように示している場合:

デウスエクスヒューマンレボリューション ミッシングリンク

そして、batch_name は次のように述べています。

デウスエクスヒューマンレボリューション ミッシングリンクDLC

結果は空/間違った/偽になります...データベースでゲームがまったく見つかりません。

次のようなものについても同じことが言えます。

Database = Lego Star Wars The Complete Saga
batch_name = Lego Star Wars : The Complete Saga
結果: False

SQL クエリを実行するためのより良い方法はありますか?
または、特殊文字 (-minus- & [brackets] など)
を含む文字列や、データベース内の名前に含まれていない文字 (DLC、CE など) を処理できるように、そのクエリを機能させるにはどうすればよいですか? ...)?

4

2 に答える 2

3

あいまい検索アルゴリズムとあいまい検索結果を探しています。これは研究の全分野です。ただし、Google を簡単に使用できる場合は、開始するための簡単なチュートリアルもいくつかあります。

2 つの文字列の「近さ」を計算する、 PHP の素晴らしいレーベンシュタインメソッドのようなものを試してみたくなるかもしれません。ただし、これにはすべてのレコードと照合する必要があります。何千ものレコードがある場合、それは問題外です。

MySQL には、役立つ可能性のあるマッチング ツールがいくつかあります。私がこれを書いているとき、誰かがすでにコメントでFULLTEXT と MATCH () について言及していることがわかります。それらは素晴らしい方法です。

他にも検討すべき優れたソリューションがいくつかあります。キーワードのインデックスを保存し (of/the/an/am/is/are/was/of/from などのすべての記事とヘルパーを削除して)、検索で各単語を検索するのが簡単な解決策です。ただし、返される値が適切に重み付けされておらず、ローカライズがまったく行われていないため、優れた結果は得られません。

安価で優れたサードパーティの検索ツール (Lucene が頭に浮かびます) もたくさんあり、この作業のほとんどを実行してくれます。API を呼び出すだけで、検索用のキャッシュ、キーワード、インデックス作成、ファジーなどを管理します。

以下は、あいまい検索に関連するいくつかの SO の質問です。より多くの用語やアイデアを見つけるのに役立ちます。

于 2013-03-08T21:59:34.350 に答える
1

MySQL クエリでは、パーセント文字を LIKE 演算子と組み合わせてジョーカー (%) として使用できることがわかりました。

正確に何を望んでいるかに応じて、複数のソリューションがあります。

  • 全文検索ができます
  • soundexのような言語アルゴリズムを使用して検索できます
  • キーワードで検索できます

完全一致が詳細検索よりも優先されるかどうかに応じて、複数のパスで検索を行うことができることに注意してください (完全一致を検索し、次にすべての辺でパーセント、単語を爆発させてからすべての単語の間に % を挿入する、キーワードで検索するなど)。 .

于 2013-03-08T22:02:54.863 に答える