这是我第一次为我的数据库编写实际搜索功能。
该数据库包括酒店名称,酒店食品,酒店位置。
我希望在搜索字符串时显示上述三个。
是否有可以使用的常用搜索算法或包?
预期结果集:
56 |肯德基|炸鸡|酒店| 1
12 | [食品名称] | [食品描述] | food_item | 2
19 | [酒店名称] | [酒店描述] |酒店| 3
...
答案 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的效果非常好:
答案 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%";
如果您的数据库变得越来越大(例如每张表<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