我想建立我的第一个真正的搜索功能。我一直在谷歌上搜索,但是我无法真正理解并理解一切。
我的数据库存在三个InnoDB表:
proID
(主要,自动增量),content
(最多包含几百个字),title
,author
,year
和一堆与搜索查询无关的其他人。行数:100到2000。catID
(主要,自动增量),catName
。行:5-30 pcID
(主要,自动增量),catID
,proID
。行数:产品量的1-5倍。我的搜索功能提供以下功能。它们不必填写。如果填写了多个,最终查询将使用AND查询将它们连接起来:
OR
- 查询)author
- 产品列您可能已经注意到,当选择某个类别时,表格产品和产品类别会连接在一起以进行搜索查询。两者之间还有一个外键。
清除关系是一个如何解释它的例子(没有搜索年份!):
搜索WHERE (products.content = term 1 OR products.content = term 2 OR products.title = term 1 OR products.title = term 2 ......) AND (products.author = author) AND (productscategories.catID = catID1 OR productscategories.catID= catID2 ......)
另请注意,我创建了一个分页系统,每个“页面”只显示10个结果。
我遇到的问题如下:我希望优化此搜索查询,但无法确定哪种方式最佳。
我发现Googling的大多数情况都使用了LIKE %%
mysqli查询。但有些人使用了MATCH...AGAINST
。我似乎非常喜欢最后一个,因为我读到它可以排序相关性,因为它似乎使查询更容易创建(1匹配术语值而不是大量的LIKE %%
与OR
相结合。看来我只会在Term-searchfield上使用它。但是对于MATCH...AGAINST
,我需要一个MyIsam表(对吗?),我不能使用外键来防止数据库出现故障。
MATCH...AGAINST
示例(没有年份字段,类别字段且未加入产品和产品类别):
SELECT *,MATCH (content,title) AGAINST ('search terms' IN BOOLEAN MODE) AS relevance
FROM products WHERE (MATCH (content,title) AGAINST ('search terms' IN BOOLEAN MODE)) AND
author='author' SORT BY relevance LIMIT 10
%LIKE%
示例(没有年份字段,类别字段,没有加入产品和产品类别),遗憾的是没有相关性排序:
SELECT * FROM products WHERE
(content LIKE '%term1%' OR content LIKE '%term2' OR title LIKE '%term1%' OR title LIKE '%term2%')
AND (author='author') SORT BY title LIMIT 10
我可以使用CASE
进行相关性排序,如果标题或内容中包含一个词,则可以添加“点数”吗?或者这会使查询对性能过重?
那么进行此类查询的最佳方法是什么?使用Innodb和LIKE
,或切换到MyIsam并使用MATCH...AGAINST
进行排序?
答案 0 :(得分:4)
你不必切换到MyIsam。 Mysql 5.6及更高版本支持全文索引。
我通常建议使用全文索引。在列标题,作者,年份
上创建全文索引然后,您可以同时对所有3个运行全文查询,并应用IN BOOLEAN MODE来真正缩小搜索范围。这是你必须自己决定的事情,但全文中的选项更多。
但是,如果您正在运行在范围,日期或简单字符串之间生成的查询。然后标准索引更好,但是对于不同列中的tekst搜索,全文索引是可行的方法!
阅读本文:http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html