1

こんにちは: キーワードでタグ付けされた商品を「加重検索」したいと考えています。(つまり、全文検索ではなく、n 対 m の関係)。だからここにあります:

Table 'product':
sku  - the primary key
name

Table 'keywords':
kid   - keyword idea
keyword_de  - German language String   (e.g. 'Hund','Katze','Maus')
keyword_en  - English language String  (e.g. 'Dog','Cat','Mouse')

Table 'product_keyword' (the cross-table)
sku   \__ combined primary key
kid   /

私が望むのは、少なくとも 1 つの関連キーワードを「含む」すべての製品のスコアを取得することです。('Dog','Elephant','Maus') を検索すると、それが欲しい

イヌのスコアは 1.003、ゾウのスコアは 1.002、マウスのスコアは 1.001 です。

したがって、最も重要でない検索用語は 1.001 から始まり、それ以外はすべて 0.001++ です。そうすれば、スコアの下限 3.0 は "AND" クエリ (3 つのキーワードすべてが見つかる必要があります) に等しくなり、スコアの下限 1.0 は "OR" に等しくなります。多かれ少なかれ一致する何かの間にあるもの。特に、このスコアに従って並べ替えることにより、最も関連性の高い検索結果が最初になります (下限に関係なく)...

私は何かをしなければならないと思います

  IF( keyword1 == 'dog', 1.001, 0) + IF...

おそらくSUM()内で、おそらくクロステーブル上のJOINの最後にGROUP BYを使用していますか?しかし、私はこれに取り組む方法がまったくわかりません。

実行可能なことは、事前にキーワードからキーワード ID を取得することです。それは安価なクエリです。したがって、キーワード テーブルは無視されたままにすることができ、それはクロス テーブルとプロダクト テーブルの他方に関するものです...

かなり長い PHP ステートメントを自動的に準備するための PHP を手元に持っていますが、さらに複数の SQL ステートメントを作成することは避けたいと考えています。特に、ページング モードの結果のクエリ結果を (ほとんどの場合、「LIMIT 0, 20」に) 制限するため、スクリプトを介して結果の間に非常に多くの数をループするのは良くありません...

DANKESCHÖN、これについて私を助けることができれば:-)

4

1 に答える 1

2

これの多くは、Zend Framework の PHP で利用できる Lucene エンジン (http://lucene.apache.org/java/docs/index.html) にあると思います: http://framework.zend.com /manual/ja/zend.search.lucene.html .

編集:

あなたが話している重み付けをしたい場合は、次のようなものを使用できると思います:

select p.sku, sum(case k.keyword_en when 'Dog' then 1001 when 'Cat' then 1002 when 'Mouse' then 1003 else 0 end) as totalscore
from products p
left join product_keyword pk on p.sku = pk.sku
inner join keywords k on k.kid = pk.kid
where k.keyword_en in ('Dog', 'Cat', 'Mouse')
group by p.sku

(編集2:group by句を忘れました。)

于 2011-01-18T12:15:54.323 に答える