这是我第一次为数据库编写实际的搜索功能。
该数据库包括酒店名称、酒店食品、酒店位置。
我希望以上三个在搜索字符串时显示出来。
有什么常用的搜索算法或软件包可以使用吗?
预期结果集:
id|name|description|table_name|rank
56 |肯德基|炸鸡|酒店|1
12|[食品名称]|[食品描述]|food_item|2
19|[酒店名称]|[酒店描述]|酒店|3
你指的是关系数据库吗?如果是,那么您的"搜索"算法就是WHERE子句。
你的意思是上下文搜索吗?Lucene是用Java编写的一个很棒的搜索引擎实现。这可能有助于你将其与Lucene结合:
http://www.cabotsolutions.com/2009/05/using-solr-lucene-for-full-text-search-with-mysql-db/
如果你正在考虑基于某些标准对网站进行爬网,那么答案要复杂得多。请澄清。
如果您使用的是Microsoft SQL Server,FreeText工作得很好:
http://msdn.microsoft.com/en-us/library/ms176078.aspx
让我们考虑一下您使用的是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注入的影响
- 您可能(或不)希望将查询分组为一个更大的查询
如果您的数据库越来越大(如每个表<100000行),或者您有很多或搜索查询,您可能有兴趣创建搜索索引,或者使用专用数据库进行文本搜索,如弹性搜索或其他。
编辑:如果相关性是一个问题,请使用MATCH AGAINST
:
- http://maisonbisson.com/blog/post/10752/making-mysql-do-relevance-ranked-full-text-searches/
- http://www.devshed.com/c/a/PHP/Using-Relevance-Rankings-for-Full-Text-and-Boolean-Searches-with-MySQL/
- PHP MySQL按相关性搜索和排序
您必须创建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