2011-08-24 59 views
4

我有一套分貝的項目。每個item有一個name and a description。我需要實現一個search設施,它需要一些關鍵字並返回不同的項目,其中至少有一個關鍵字匹配名稱or描述中的一個詞。如何創建用於搜索部分匹配的sql查詢?

例如 我在分貝,三個項目

1.item1 : 
    name : magic marker 
    description: a writing device which makes erasable marks on whiteboard 

2.item2: 
    name: pall mall cigarettes 
    description: cigarette named after a street in london 

3.item3: 
    name: XPigment Liner 
    description: for writing and drawing 

使用關鍵字「寫作」應該返回魔術筆和XPigment襯墊搜索

使用關鍵字「商場」應該返回一個搜索第二項

我使用LIKE關鍵字和分別IN關鍵字,.. 試圖對於IN關鍵字工作,查詢必須是

SELECT DISTINCT FROM mytable WHERE name IN ('pall mall cigarettes') 

SELECT DISTINCT FROM mytable WHERE name IN ('mall') 

將返回0行

我無法弄清楚如何使可同時名稱和描述列,並允許部分單詞匹配查詢..

有人可以幫忙嗎?

更新:

我通過休眠和用於描述字段,用於javax.persistence @Lob annotation.Using PSQL創建表時我檢查表,它示出

... 
id   | bigint      | not null 
description | text      | 
name   | character varying(255)  | 
... 

表中的記錄之一就是,

id | description | name 
21 | 133414  | magic marker 
+0

您需要使用LIKE而不是IN。 IN用於從一組中找出值。 LIKE應該用於部分字符串比較。 – Bruce

+0

首先,你需要弄清楚文本描述存儲在哪張表中 –

+0

有沒有什麼辦法可以找到?我使用postgres ..使用/ d命令找不到多少 –

回答

15

首先,這種方法在規模不會很大的情況下,你會n從一個單詞到一個單獨的索引(如倒排索引)。

如果你的數據不是很大,你可以做

SELECT DISTINCT(name) FROM mytable WHERE name LIKE '%mall%' OR description LIKE '%mall%' 

使用OR如果您有多個關鍵字。

+0

您需要'選擇不同的名稱從...' –

+2

您應該注意區分大小寫。 – Bruce

+0

在db中,我將描述存儲爲一個javax.persistence.Lob類型。因此,db(postgres)表有一個數字(133414等)作爲字段內容..'description LIKE'%something%'失敗返回一場比賽..任何想法如何處理這個? –

4

這可能也適用。

SELECT * 
FROM myTable 
WHERE CHARINDEX('mall', name) > 0 
    OR CHARINDEX('mall', description) > 0