如何实现搜索算法

时间:2012-02-03 21:18:31

标签: php database search search-engine

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

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

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

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

预期结果集:

id |名字|描述| table_name |等级

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

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

19 | [酒店名称] | [酒店描述] |酒店| 3

...

4 个答案:

答案 0 :(得分:2)

你的意思是关系数据库吗?如果是,则“搜索”算法是WHERE子句。

你的意思是上下文搜索? Lucene是一个用Java编写的优秀搜索引擎实现。这可能有助于你与Lucene结婚:

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

如果您考虑根据某些标准抓取网站,答案会复杂得多。请澄清。

答案 1 :(得分:1)

如果您使用的是Microsoft SQL Server,FreeText的效果非常好:

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

答案 2 :(得分: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个更大的查询

如果您的数据库变得越来越大(例如每张表<10万行),或者您有很多或搜索查询,您可能有兴趣创建搜索索引,或使用< strong>专用数据库打算进行文本搜索,如弹性搜索或其他内容。

编辑: 如果相关性是一个问题,请使用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

答案 3 :(得分: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