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にしかアクセスできない人のために検索を提供できるようにしたいと思います。