2

MySQL DB で (ある種の) 全文検索を作成しようとしています: 2 つのフィールドで文字列 'abc' の出現を検索し、TITLE出現DESCRIPTION回数 (行ごと) で結果を並べ替えたいのですが、できれば加重します。つまり、 で見つかったすべての 'abc' はTITLE、 での一致の 2 倍にカウントされDESCRIPTIONます。

これは 1 つの (おそらく長くて醜い) クエリでまったく可能ですか、それとも単語インデックス テーブルを作成する必要がありますか?

これまでの私のアプローチは、出現を見つけますが、並べ替えはしませんが、重みだけです。(私は PHP で後者を行いますが、これは非常に高価になり始めています):

SELECT * FROM CONTENT WHERE (`TITLE` like '%abc%' OR DESCRIPTION like '%abc')
4

2 に答える 2

2

replace検索ヒット数だけ文字列を短縮するために使用できます。このようにして、列内の文字列の出現回数を数えることができます。各オカレンスカウントの前に係数を置いて、その重みを増やすことができます。この例はcol12回カウントされます。

select  *
,       (
          2 * (char_length(col1) - char_length(replace(col1,'abc',''))) +
          (char_length(col2) - char_length(replace(col2,'abc','')))
        ) / char_length('abc') as Occurances
from    YourTable
order by
        Occurances desc

SQLFiddleでの実例。

于 2013-02-17T13:25:27.507 に答える
2

試す:

SELECT 2*(LENGTH(`TITLE`)-LENGTH(REPLACE(`TITLE`,'abc',''))) + 
         (LENGTH(DESCRIPTION)-LENGTH(REPLACE(DESCRIPTION,'abc',''))) sort_num,
       c.* FROM CONTENT c
WHERE (`TITLE` like '%abc%' OR DESCRIPTION like '%abc')
ORDER BY 1 DESC
于 2013-02-17T13:20:13.790 に答える