这是我第一次为我的数据库编写实际的搜索功能。如何实现搜索算法
该数据库由酒店名称,酒店食品,酒店位置组成。
我想在搜索字符串期间显示上述三个。
是否有任何常用的搜索算法或软件包可以使用?
预期结果集:
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