如何实现搜索算法


How to implement a Search Algorithm

这是我第一次为数据库编写实际的搜索功能。

该数据库包括酒店名称、酒店食品、酒店位置。

我希望以上三个在搜索字符串时显示出来。

有什么常用的搜索算法或软件包可以使用吗?

预期结果集:

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