2015-05-11 95 views
0

我有一個MySQL數據庫例如所謂的「關鍵字」字段關鍵字的列表中記錄的關鍵字字段包含3個樣本記錄MYSQL匹配關鍵字列表逗號分隔文本字段

KEYWORD LIST 1: tree,apple,banana,cherry,flower,red apple,pink cherry,cat,mouse 

KEYWORD LIST 2: cat,mouse,apple,red apple,flower,red appleberry 

KEYWORD LIST 3: apple, red appleberry, flower 

的關鍵字列表不是一個數組 - 只是一個mysql數據庫中的文本字段,它有很多其他字段。

當我運行從我所看到的一個MYSQL SELECT查詢「到目前爲止,」有兩種方式:1)像%% b)針對

比賽比方說,我想請對單詞的查詢「蘋果」

SELECT *從哪裏表

LIKE「%蘋果%」的關鍵字這將彈出包含單詞「蘋果」,包括以上,但它並不一定給我任何順序記錄記錄更高或更低。我不得不做的結果後過濾查詢。

假如我是在我的查詢更詳細,並選擇了「紅蘋果」它仍然會顯示一個比賽,但我不一定會得到具有關鍵字列表1比2或3

有人更相關使用對陣代替

SELECT *, MATCH(Keywords) AGAINST('apple') AS Score 
FROM table 
WHERE Keywords like '%red apple%' 
ORDER BY score DESC; 

這是朝着正確的方向肯定航向建議 - 但將不會通過精確匹配的結果被人發現更多相關的排序。相關性將基於關鍵字列表中出現「蘋果」一詞的多少次重複(這是所有搜索引擎選擇完全忽略關鍵字的古老原因) - 您是否看到我要與此相伴?

我正在尋找的是在MYSQL中處理大部分邏輯,而不是像其他人所說的那樣將其讀入數組並在PHP中處理。因此這個簡單的例子。

下面是查詢應該給它應該如何:

1)如果我的查詢是「蘋果」的關鍵字列表1應顯示第一

2)如果我的查詢是「紅蘋果」,那麼關鍵字列表2應該顯示首先是因爲'red apple'這個詞在關鍵字列表的FRONT處更接近於字符串的開頭。

因爲LIKE %%

關鍵字列表3會出現,而不是「紅蘋果」,即使比賽是「紅色appleberry」,但

(這將是最簡單的MySQL是否有某種'explode'函數可以指定逗號(',')作爲匹配中的分隔符,但我不知道任何這樣的方法,是嗎?當然,您必須將整個結果列表讀入3)假設我搜索'紅蘋果',這裏是bug:我仍然會在'紅蘋果'(記錄3)上找到一個匹配項, - 我不想那樣。記錄2應顯示,然後記錄1,甚至不顯示記錄3.

這是一個討論和一個查詢。任何人有任何建議?

我自己的答案: 包括在查詢的 而不是搜索的「紅蘋果」搜索逗號「紅蘋果」 但如果用戶把之間的空間 - 在末端或者其關鍵字列表?

問題: 我們如何在MYSQL的逗號分隔文本字段中搜索特定的SCORE,使用精確的單詞(而不是片段)來創建ORDERED結果列表。

儘管紅蘋果和紅蘋果是用逗號分隔的兩個不同的短語,但到目前爲止的每一次嘗試仍將使關鍵字列表3顯示高於2。

謝謝!來!我們討論一下!

+0

棧是Q&A網站不是一個討論參見[文章](http://meta.stackexchange.com/questions/13198/where-我可以找到有趣的編程討論) – xQbert

+2

爲什麼這些關鍵字全部卡在一個列中而不是另一個表中? –

+1

您的數據庫設計混亂了。有了這個設計,你就不會得到你想要的滿足和高性能的方式。 – Reeno

回答

1

對於小項目,你可以做這樣的事情

SELECT *, 
case when keyword like '%red apple%' then 1 else 0 end exact_match,  
MATCH(Keywords) AGAINST('apple') AS Score 
FROM table 
where keywords like '%apple%'  
ORDER BY exact_match DESC, score DESC; 
+0

謝謝。現在對於這個特定的搜索項目,我們有3個字段 - 它們與我們所熟悉的非常相似: 標題 - 描述 - 關鍵字 - 我正在創建的是一個聲明,它創建一個基於這三個字段在給定搜索中的相關性。我意識到要做到這一點的方法是首先創建一個INDEX - 你有沒有關於如何創建一個快速生成分數的FULL TEXT索引的見解? – Viktor

+0

我認爲全文索引的想法是它會掃描您的文本,並根據關鍵字爲您提供相關順序的結果。直到您提供搜索關鍵字纔有分數。 – Tim3880

相關問題