2014.09.23 mysql 1本のsql文実装検索機能(重み付けソート)


 、   SQL  (    case when xx then x else x end  mysql   )

 
検索機能の実装:重み付けソート原理
 
1.各キーワードがタイトル、ラベル、要約に一致すると、重み値が得られ、この重み値をソートの根拠とする.2.複数のキーワードを入力した場合、各キーワードが一致した重み値を積上して最終的な重み値を得ることで、「複数のキーワードが一致しているものが上位にある」ことを満たし、この最終的な重み値でソートすることができます.具体的には、次のようになります.
 
ウェイトの既定値(0.1)
ケース1:2つのキーワードk 1,k 2を入力し、そのうちk 1は1つの文章の要約に一致し、k 2も同じ文章の要約に一致する
一致
スコア
k1
k2
見出し
4
×
×
タブ
3
×
×
サマリ
2


ウェイト値(Weight Value)
 
0.1+0.1+2 = 2.2
0.1+0.1+2 = 2.2
最終ウェイト値(積算)
 
2.2×2.2 = 4.84
最終ウェイト値(合計)
 
2.2+2.2 = 4.4
 
ケース2:2つのキーワードk 1,k 2を入力し、k 1は1つの文章のタイトル、ラベル、要約に一致し、k 2はいずれの文章にも一致しない
一致
スコア
k1
k2
見出し
4

×
タブ
3

×
サマリ
2

×
ウェイト値(Weight Value)
 
4+3+2 = 9
0.1+0.1+0.1 = 0.3
最終ウェイト値(積算)
 
9×0.3 = 2.7
最終ウェイト値(合計)
 
9+0.3 = 9.3
 
ケース3:2つのキーワードk 1,k 2を入力し、そのうちk 1は1つの文章のタイトル、ラベル、要約に一致し、k 2は同じ文章の要約に一致する
一致
スコア
k1
k2
見出し
4

×
タブ
3

×
サマリ
2


ウェイト値(Weight Value)
 
4+3+2 = 9
0.1+0.1+2 = 2.2
最終ウェイト値(積算)
 
9×2.2 = 19.8
最終ウェイト値(合計)
 
9+2.2 = 11.2
SELECT
 1 * (
  document.w10 + document.w20 + document.w30
 ) * (
  document.w11 + document.w21 + document.w31
 ) AS w,
 document.*
FROM
 (
  SELECT
   0,
   CASE WHEN d.abstracts LIKE '%1%' THEN
    2 ELSE 0.1
    END AS w10,
   CASE WHEN d.tags LIKE '%1%' THEN 
    3 ELSE 0.1
    END AS w20,
   CASE WHEN d. NAME LIKE '%1%' THEN
    4 ELSE 0.1
    END AS w30,
   CASE WHEN d.abstracts LIKE '%2%' THEN
    2 ELSE 0.1
    END AS w11,
   CASE WHEN d.tags LIKE '%2%' THEN
    3 ELSE 0.1
    END AS w21,
   CASE WHEN d. NAME LIKE '%2%' THEN
    4 ELSE 0.1
    END AS w31,
   d.*
 FROM
  document d 
) document LEFT JOIN document dd
ON document.id = dd.id
 WHERE
 dd.sts = 'normal'
 AND to_days(now()) >= to_days(dd.protect_time)
 AND dd.create_time >= '2014-07-10 00:00:00'
 AND dd.create_time <= '2014-09-23 09:13:56'
 AND dd.category_id LIKE '0001%'
 AND dd.p_id LIKE '%'
 HAVING w > 0.09
 ORDER BY
 w DESC,
 dd.create_time DESC