0

mysql テーブル内に製品を格納する非常に単純な製品カタログを作成しています。製品をできるだけ速く (そしてできるだけ関連性を持って) 検索したいと考えています。製品データベースは非常に大きくなります (約 500.000 製品)。これが、インデックスを使用しない「いいね」を使用した検索が非常に遅い理由です。

多くのフィールドがありますが、検索したいフィールドは次のとおりです。

  • product_id = bigint
  • タイトル = varchar(255)
  • 説明 = テキスト

全文検索を試してみましたが、いくつかの問題がありました。

  • product_id は大きな整数であり、フルテキスト インデックス内でインデックス化できないため、検索できませんでした (ユーザーが製品の ID を知っている場合があります)。
  • 「メーター XY-123」を検索すると、単一の製品のタイトルと説明に両方の単語 (「メーター」と「xy-123」) が含まれているにもかかわらず、検索結果が得られません。
  • 部分文字列を検索できませんでした。たとえば、製品のタイトルが「Foobar 123」の場合、ユーザーが次のように検索しても返されます。
    • フーバー 123
    • バー 123
    • フーバー 12
    • ふー
  • 結果は、何らかの関連性によって順序付けされて返される必要があります。たとえば、「foobar 123」と「foobar 456」という 2 つの製品があり、ユーザーが「foobar 4」を検索した場合、両方の製品が返されます (任意の単語に一致します)。最初のもの (番号 4 を含まない) よりも上位にランク付けする必要があります (番号 4 も含まれているため)。
  • 製品は、値が見つかったフィールドに基づいてランク付けする必要もあります。この場合、product_id フィールドはタイトルよりも重みが大きく、説明よりも重みが大きくなります。たとえば、ユーザーが「1234」を検索した場合:
    • 最初にランク付けされた製品は、product_id 1234 を持つ製品である必要があります
    • その後、タイトルに「1234」を含む商品がランクインするはずです
    • その後、説明内にこの番号が含まれる製品

このテーブルをこのように検索するにはどうすればよいでしょうか? 私の場合に良い結果をもたらす唯一の方法は、クエリ文字列を分割し、すべての文字列に対して「like」演算子を使用して複数のクエリをクエリし、何らかの方法で重みを計算することですが、このソリューションは非常に遅く動作します (単一のクエリで 15 秒以上)これは遅すぎます)。

単一のクエリのみを使用してすべてが可能になるとは思っていませんが、高速で可能な限り適切なソリューションを探しています。これがある種のカスタム単語インデックスなどを構築することを意味する場合、私もこれを喜んで行います。これを管理する方法が必要なだけですか?

ありがとう!

4

1 に答える 1

2

検索を Sphinx に移行しました。次に、結果を微調整する必要があります。

于 2013-11-27T10:29:00.323 に答える