2012-02-03 333 views
1

這是我第一次爲我的數據庫編寫實際的搜索功能。如何實現搜索算法

該數據庫由酒店名稱,酒店食品,酒店位置組成。

我想在搜索字符串期間顯示上述三個。

是否有任何常用的搜索算法或軟件包可以使用?

預期結果集:

id |名稱|描述| table_name | rank

56 |肯德基|炸雞|酒店| 1

12 | [食品名稱] | [食品描述] | food_item | 2

19 | [酒店名稱] | [酒店說明] |酒店| 3

....

+1

取決於你想要多麼複雜得,什麼數據庫您正在使用。 – dqhendricks 2012-02-03 21:23:38

+0

我正在使用mysql – 2012-02-03 21:38:35

回答

1

如果您使用Microsoft SQL Server,FreeText的作品非常好:

http://msdn.microsoft.com/en-us/library/ms176078.aspx

+0

謝謝,我正在研究如何爲我的mysql數據庫啓用全文搜索。 – 2012-02-03 21:43:24

+0

http://devzone.zend.com/26/using-mysql-full-text-searching/ – 2012-02-03 21:45:11

+0

答案提到「Free Text」,它只存在於Microsoft SQL Server中。嘗試上面的鏈接以使用MySQL進行全文搜索 – 2012-02-03 21:46:00

2

你的意思是一個關係型數據庫?如果是的話,你的「搜索」算法是一個WHERE子句。

你的意思是上下文搜索? Lucene是用Java編寫的一個很好的搜索引擎實現。這可以幫助你使用Lucene嫁了吧:

http://www.cabotsolutions.com/2009/05/using-solr-lucene-for-full-text-search-with-mysql-db/

答案是複雜得多,如果你想進一步瞭解檢索基於某些條件的網站。請澄清。

+0

今天我還沒有看到更好的答案。 +1 – Mob 2012-02-03 21:23:43

+0

不,我不是指「where」條款。我希望根據搜索字符串對搜索結果進行排名。不是簡單的選擇* from ... – 2012-02-03 21:25:36

+0

我有三個不同的表來搜索,我不想寫三個不同的查詢,然後編譯我的搜索。 – 2012-02-03 21:26:16

1

讓我們考慮一下你使用的是mysql。

那麼你的問題基本上是:如何編寫一個查詢,將搜索酒店名稱,食品和酒店的位置。

我猜這3個信息存儲在3個不同的表中。最簡單的方法是簡單地查詢3代表一前一後與查詢像論文:

SELECT * FROM hotel WHERE hotel_name LIKE "%foobar%"; 
SELECT * FROM hotel_food_item WHERE item_name LIKE "%foobar%"; 
SELECT * FROM hotel_location WHERE hotel_name LIKE "%foobar%" OR street_name LIKE "%foobar%" OR city LIKE "%foobar%"; 
  • 確保您的搜索詞是安全的從SQL注入
  • 你可能(或不)想組查詢到1個更大的查詢

如果您的數據庫變大(比如每桌< 100 000線),或者如果你有很多或搜索查詢時,您可能會感興趣的創建搜索索引 ,或使用專用數據庫打算進行文本搜索,如彈性搜索或其他。

編輯: 如果相關性是一個問題,使用MATCH AGAINST

你必須創建3子查詢是做MATCH AGAINST,和他們一起編譯它們。你可以做AGAINST("foobar") as rank,這樣你就可以得到你需要的分數。

這應該是這樣的:

SELECT * 
FROM 
(
SELECT id, 'hotel' as table_name, MATCH (search_field1) AGAINST ("lorem") as rank FROM tableA 
UNION 
SELECT id, 'food' as table_name, MATCH (search_field2) AGAINST ("lorem") as rank FROM tableB 
) as res 

ORDER BY res.rank DESC 
+0

:)我知道我可以做到這一點。 但我希望能夠根據搜索關鍵對結果進行排名。 – 2012-02-03 21:28:18

+1

您的意思是「相關性」? – FMaz008 2012-02-03 21:29:25

+0

@Prakash拉曼編輯答案關於相關性搜索的詳細信息。 – FMaz008 2012-02-03 21:32:42

1

,如果你不使用InnoDB表,取而代之的是使用MyISAM數據,你可以使用內置的全文搜索MySQL的。

這部作品首先把你要搜索的列的全文索引,然後創建一個查詢,看起來大致是這樣的:

SELECT *, MATCH(column_to_search) AGAINST($search_string) AS relevance 
FROM your_table 
WHERE MATCH(keywords) AGAINST($search_string IN BOOLEAN MODE) 
ORDER BY relevance 
LIMIT 20 
+0

並不像所提出的lucene那樣先進,但更容易實現,並且從我所經歷的,工作得很好。 – dqhendricks 2012-02-03 22:30:40