這是我第一次爲我的數據庫編寫實際的搜索功能。如何實現搜索算法
該數據庫由酒店名稱,酒店食品,酒店位置組成。
我想在搜索字符串期間顯示上述三個。
是否有任何常用的搜索算法或軟件包可以使用?
預期結果集:
id |名稱|描述| table_name | rank
56 |肯德基|炸雞|酒店| 1
12 | [食品名稱] | [食品描述] | food_item | 2
19 | [酒店名稱] | [酒店說明] |酒店| 3
....
這是我第一次爲我的數據庫編寫實際的搜索功能。如何實現搜索算法
該數據庫由酒店名稱,酒店食品,酒店位置組成。
我想在搜索字符串期間顯示上述三個。
是否有任何常用的搜索算法或軟件包可以使用?
預期結果集:
56 |肯德基|炸雞|酒店| 1
12 | [食品名稱] | [食品描述] | food_item | 2
19 | [酒店名稱] | [酒店說明] |酒店| 3
....
如果您使用Microsoft SQL Server,FreeText的作品非常好:
謝謝,我正在研究如何爲我的mysql數據庫啓用全文搜索。 – 2012-02-03 21:43:24
http://devzone.zend.com/26/using-mysql-full-text-searching/ – 2012-02-03 21:45:11
答案提到「Free Text」,它只存在於Microsoft SQL Server中。嘗試上面的鏈接以使用MySQL進行全文搜索 – 2012-02-03 21:46:00
你的意思是一個關係型數據庫?如果是的話,你的「搜索」算法是一個WHERE子句。
你的意思是上下文搜索? Lucene是用Java編寫的一個很好的搜索引擎實現。這可以幫助你使用Lucene嫁了吧:
http://www.cabotsolutions.com/2009/05/using-solr-lucene-for-full-text-search-with-mysql-db/
答案是複雜得多,如果你想進一步瞭解檢索基於某些條件的網站。請澄清。
今天我還沒有看到更好的答案。 +1 – Mob 2012-02-03 21:23:43
不,我不是指「where」條款。我希望根據搜索字符串對搜索結果進行排名。不是簡單的選擇* from ... – 2012-02-03 21:25:36
我有三個不同的表來搜索,我不想寫三個不同的查詢,然後編譯我的搜索。 – 2012-02-03 21:26:16
讓我們考慮一下你使用的是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%";
如果您的數據庫變大(比如每桌< 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
,如果你不使用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
並不像所提出的lucene那樣先進,但更容易實現,並且從我所經歷的,工作得很好。 – dqhendricks 2012-02-03 22:30:40
取決於你想要多麼複雜得,什麼數據庫您正在使用。 – dqhendricks 2012-02-03 21:23:38
我正在使用mysql – 2012-02-03 21:38:35