そこで、MySQLで検索することにしました...
SELECT *
FROM items AS i
INNER JOIN tags AS t ON i.id = t.item_id
WHERE item LIKE ('%s%' OR '%s2%' ... OR '%sn%')
AND tag LIKE ('%s%' OR '%s2%' ... OR '%sn%');
全文ではありません。項目は VARCHAR(32)、タグは VARCHAR(16) です。
結果の順序付けに問題があります... 1 つの検索文字列に関しては優先順位を直接取得できますが、それ以上になると、少しでたらめになり、(検索文字列の数)+7 クエリになってしまい、私は感じます使ってて本当に汚い。実際に使ってたわごとを浴びるよりも汚く感じます.これはどのように見えるか.
SELECT
t1.item_id, t1.item, t1.created, t1.owner, t1.type, t1.fld, t2.tag
FROM
items AS t1
INNER JOIN
tagged AS t2 ON t1.item_id = t2.item_id
WHERE
(item LIKE '%red%' OR '%apple%')
GROUP BY
item_id
ORDER BY
CASE
WHEN item = 'red'
THEN 0
WHEN item = 'apple'
THEN 1
WHEN (item LIKE 'red%' OR 'apple%')
THEN 2
WHEN (item LIKE '%red%' AND '%apple%')
AND (tag LIKE '%red%' AND '%apple%')
THEN 3
WHEN (item LIKE '%red%' AND '%apple%')
AND (tag LIKE '%red%' OR '%apple%')
THEN 4
WHEN (item LIKE '%red%' AND '%apple%')
THEN 5
WHEN (item LIKE '%red%' OR '%apple%')
AND (tag LIKE '%red%' OR '%apple%')
THEN 6
WHEN (item LIKE '%red%' OR '%apple%')
THEN 7
WHEN (tag LIKE '%red%' OR '%apple%')
THEN 8
ELSE 9
END ASC ,
created DESC
LIMIT 0 , 30
ええ、それはとても汚いです、どうすればそれを切ることができますか? 私は実際に、検索文字列からそのクエリを生成する PHP スクリプトを使用しています。そのクエリは、順序付けのないクエリよりも少しだけ遅く、負荷が高くなりませんが、私にとっては汚いと感じます。これを行うよりエレガントな方法はありますか?