2012-02-03 244 views
1

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

该数据库由酒店名称,酒店食品,酒店位置组成。

我想在搜索字符串期间显示上述三个。

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

预期结果集:

id |名称|描述| table_name | rank

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

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

19 | [酒店名称] | [酒店说明] |酒店| 3

....

+1

取决于你想要多么复杂得,什么数据库您正在使用。 – dqhendricks 2012-02-03 21:23:38

+0

我正在使用mysql – 2012-02-03 21:38:35

回答

1

如果您使用Microsoft SQL Server,FreeText的作品非常好:

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

+0

谢谢,我正在研究如何为我的mysql数据库启用全文搜索。 – 2012-02-03 21:43:24

+0

http://devzone.zend.com/26/using-mysql-full-text-searching/ – 2012-02-03 21:45:11

+0

答案提到“Free Text”,它只存在于Microsoft SQL Server中。尝试上面的链接以使用MySQL进行全文搜索 – 2012-02-03 21:46:00

2

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

你的意思是上下文搜索? Lucene是用Java编写的一个很好的搜索引擎实现。这可以帮助你使用Lucene嫁了吧:

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

答案是复杂得多,如果你想进一步了解检索基于某些条件的网站。请澄清。

+0

今天我还没有看到更好的答案。 +1 – Mob 2012-02-03 21:23:43

+0

不,我不是指“where”条款。我希望根据搜索字符串对搜索结果进行排名。不是简单的选择* from ... – 2012-02-03 21:25:36

+0

我有三个不同的表来搜索,我不想写三个不同的查询,然后编译我的搜索。 – 2012-02-03 21:26:16

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个更大的查询

如果您的数据库变大(比如每桌< 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 
+0

:)我知道我可以做到这一点。 但我希望能够根据搜索关键对结果进行排名。 – 2012-02-03 21:28:18

+1

您的意思是“相关性”? – FMaz008 2012-02-03 21:29:25

+0

@Prakash拉曼编辑答案关于相关性搜索的详细信息。 – FMaz008 2012-02-03 21:32:42

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 
+0

并不像所提出的lucene那样先进,但更容易实现,并且从我所经历的,工作得很好。 – dqhendricks 2012-02-03 22:30:40