9

サイト コンテンツ テーブルを検索して適切な結果を取得する検索フォームがあります。

タイトルとコンテンツ フィールドを検索し、関連性の高い順に結果を取得したい。タイトルを最優先します。

次のテーブル (tblContent) があるとします。

intID | strTitle    | txtContent

1     | Smith John  | Lorem Ipsum
2     | Lorem Ipsum | Lorem John Smith Ipsum
3     | John Smith  | Lorem Ipsum Lorem Ipsum
4     | Lorem Ipsum | Lorem Ipsum Lorem Ipsum
5     | Lorem Ipsum | Lorem Ipsum Smith John

「John Smith」を検索すると、結果は 3、2、1、5 の順に返されます。

これはどのように可能ですか?

4

4 に答える 4

21

私はこれでかなりスポットを当てることができました:

SELECT *, 
( (1.3 * (MATCH(strTitle) AGAINST ('+john+smith' IN BOOLEAN MODE))) + (0.6 * (MATCH(txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE)))) AS relevance 
FROM content 
WHERE (MATCH(strTitle,txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE) ) 
ORDER BY relevance DESC
于 2013-02-22T14:33:48.000 に答える
4

mysql の全文検索は良いことですが、索引付けする単語は最低 4 文字に制限されています。制限は変更できますが、すべてのシナリオでサーバー変数を変更できるわけではありません。そんな時は、ケースバイケースで解決策を提案することをお勧めします

select 
    *
from
mytable a
WHERE
    (a.title like 'somthing%'
    OR a.title like '%somthing%'
    OR a.title like 'somthing%')
ORDER BY case
WHEN a.title LIKE 'somthing%' THEN 1
WHEN a.title LIKE '%somthing%' THEN 2
WHEN a.title LIKE '%somthing' THEN 3
ELSE 4 END;
于 2013-12-19T15:57:05.767 に答える
3

おそらくもっと効率的な方法があり、検索文字列が2語以上になる可能性があることを考えると、これはおそらく実現不可能ですが、私は次のようなことをします

ORDER BY CASE 
 WHEN strTitle LIKE '%John Smith%' THEN 1
 WHEN txtContent LIKE '%John Smith%' THEN 2
 WHEN strTitle LIKE '%Smith John%' THEN 3
 WHEN txtContent LIKE '%Smith John%' THEN 4
ELSE 5 END
于 2013-02-22T14:23:49.107 に答える
0

の線に沿った何かはどうですか

SELECT INT(id), strTitle, txtContent
FROM tblContent
WHERE name like '%John%'
GROUP BY strTitle
ORDER BY CASE WHEN strTitle like 'John %' THEN 0
           WHEN strTitle like 'John%' THEN 1
           WHEN strTitle like '% John%' THEN 2
           ELSE 3
      END, strTitle
于 2013-02-22T14:23:37.460 に答える