0

MySQL5.5.22の複数のテーブルで全文クエリを実行しています。アプリケーションはinnodbテーブルを使用するため、全文検索専用にいくつかのMyISAMテーブルを作成しました。

たとえば、私のテーブルのいくつかは次のようになります

account_search
===========
id
account_id
name
description
hobbies
interests

product_search
===========
id
product_id
name
type
description
reviews

これらのテーブルは全文検索専用であるため、非正規化されています。データは複数のテーブルから取得でき、検索テーブルに集約されます。ID列に加えて、残りの列は1つのフルテキストインデックスに割り当てられます。

全文検索で「50%」ルールを回避するために、私はを使用してIN BOOLEAN MODEいます。

したがって、上記の場合、次のように実行します。

SELECT *, MATCH(name, type, description, reviews) AGAINST('john') as relevance
FROM product_search
WHERE MATCH(name, type, description, reviews) AGAINST('john*' IN BOOLEAN MODE) LIMIT 10

SELECT *, MATCH(name, description, hobbies, interests) AGAINST('john') as relevance
FROM account_search
WHERE MATCH(name, description, hobbies, interests) AGAINST('john*' IN BOOLEAN MODE) LIMIT 10

「john」という製品もあると仮定しましょう:P

私が直面している問題は次のとおりです。

  • 意味のある関連性を得るには、。なしで検索を使用する必要がありますIN BOOLEAN MODE。これは、検索が50%ルールと語長ルールに従うことを意味します。したがって、product_searchテーブル内のほとんどの製品がと呼ばれるjohn場合、それらの関連性は0として返されることがよくあります。

  • 複数のクエリ間の関連性は比較できません。(あるクエリからの14の関連性は、別の別のクエリからの14の関連性と等しくないと思います)。

  • 検索はこれら2つのテーブルに限定されるのではなく、他の「オブジェクトタイプ」、たとえば「注文」、「トランザクション」などがあります。

キーワードのセットを指定して、すべてのオブジェクトタイプの上位7つの最も関連性の高い結果を返すことができるようにしたいと思います(1つの検索ボックスはすべてのオブジェクトの結果を返します)。

上記を考えると、トップ7を取得するためのいくつかのアルゴリズムまたはおそらくさらに良いアイデアは何ですか?

私はsolrやelasticsearchのようなものを使用できることを知っています。私はすでにそれらを試し、アプリケーションに統合する過程にありますが、MySQLにしかアクセスできない人のために検索を提供できるようにしたいと思います。

4

1 に答える 1

0

そこで、しばらく考えた結果、MySQL内で1つのクエリを使用して関連性のランク付けを行う必要があると判断しました。

それの訳は:

  • 個別のクエリ間の関連性を比較することはできません。
  • 複数の検索の内容を意味のある方法で組み合わせるのは困難です。

検索専用のインデックステーブルを1つ使用するように切り替えました。エントリは、innodbテーブルの実際の基になるデータへの挿入、削除、および更新に応じて、挿入、削除、および更新されます(これはすべて自動です)。

テーブルは次のようになります。

search
==============
id //id for the entry
type //the table the data came from
column //column the data came from
type_id //id of the row the in the original table
content //text

コンテンツ列には全文索引があります。すべてのテーブルのすべての列にインデックスが付けられるわけではなく、検索に役立つと思われるものだけが追加されていることを理解することが重要です。

contentしたがって、これは、照合するクエリを実行し、取得したものを取得して、さらに処理を行うという単純なケースです。最終結果を処理するには、親テーブルに検索結果のタイトルとおそらく他のメタデータを要求するために、さらにいくつかのクエリが必要になりますが、これは実行可能なソリューションです。

このアプローチは実際には拡張できないと思います(更新と挿入でもこのテーブルを更新する必要があります)が、アプリケーションの小規模な展開に対して適切なアプリケーション全体の検索を提供するためのかなり良い方法だと思います。

スケーラビリティーについては、elastic search、solr、luceneなどを使用してください。

于 2012-04-20T02:50:43.833 に答える