MySQL 5.5.22の複数のテーブルで全文検索を実行しています。このアプリケーションでは、innodbテーブルを使用しているので、フルテキスト検索専用のMyISAMテーブルをいくつか作成しました。例えば多くのテーブルでMySQLの全文検索で最も関連性の高い結果を集計
これらのテーブルは、全文検索のためだけであるため、私のテーブルのいくつかは
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
のは、ちょうど私達が同様に「ジョン」と呼ばれる製品を持っていると仮定しましょう:P
私が直面しています問題は、次のとおりです。
意味のある関連性を得るには、
IN BOOLEAN MODE
を付けずに検索する必要があります。これは、検索が50%の規則と語長の規則に従うことを意味します。したがって、多くの場合、product_search
テーブル内のほとんどの製品がjohn
と呼ばれると、その関連性は0として返されます。複数のクエリ間の関連性は比較できません。 (私はある質問からの14の関連性は、別の異なる質問からの14の関連性に等しくないと思う)。
検索はちょうどこれらの2つのテーブルに限定されるものではなく、例えば、他の「オブジェクトタイプ」、があります。「注文」、「取引」などが
上記のことから、トップ7を得るためのアルゴリズムや、さらに優れたアイデアは何ですか?
私はsolrやelasticsearchのようなものを使うことができますが、私はすでにそれらを試してみましたが、それらをアプリケーションに統合する手続きをしていますが、MySQLにしかアクセスできない人の検索を提供できるようにしたいと思います。