array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 sql 多个模糊查询优化 - 爱码网

目前在做“Brick4.com - 国产积木索引表”这个小工具。它是当作“工具书”而存在的,必然需要一个靠谱的检索功能。按主题和品牌这些即有的筛选就不说了,今天把我的摸索过程整理一下,说说如何用 MySQL 实现多关键词站内“模糊查找”。

拿一个简化的小表儿做例子

表名叫:article
字段有:title、subtitle、tag、text……

涉及到查找的字段有三个:title、subtitle、tag

像我这种初学者,首先想到的肯定是 LIKE ,关键词是“车”的话,就这样:

SELECT * FROM article WHERE 
title LIKE "%车%" 
OR subtitle LIKE "%车%" 
OR tag LIKE "%车%"

怎么样?LIKE 是万能的,用一个 LIKE 解决不了的事情就多用几个 LIKE 。于是多关键词就这样搞:

SELECT * FROM article WHERE 
(
  title LIKE "%车%" 
  OR subtitle LIKE "%车%" 
  OR tag LIKE "%车%" 
) OR (
  title LIKE "%摩托%" 
  OR subtitle LIKE "%摩托%" 
  OR tag LIKE "%摩托%" 
) OR (
  title LIKE "%红色%" 
  OR subtitle LIKE "%红色%" 
  OR tag LIKE "%红色%" 
) OR (
  title LIKE "%美国%" 
  OR subtitle LIKE "%美国%" 
  OR tag LIKE "%美国%" 
) OR (
  title LIKE "%2006%" 
  OR subtitle LIKE "%2006%" 
  OR tag LIKE "%2006%" 
)

虽然很工整,不过能不能简洁一点?当然行!看我变形!我们可以用正则:

SELECT * FROM article WHERE 
title REGEXP "车|摩托|红色|美国|2006"
OR subtitle REGEXP "车|摩托|红色|美国|2006"
OR tag REGEXP "车|摩托|红色|美国|2006"

怎么样?意外不意外?惊喜不惊喜?其实咱们还可以更进一步,把几个字段合并起来:

SELECT * FROM article WHERE 
CONCAT_WS(" ", title, subtitle, tag) REGEXP "车|摩托|红色|美国|2006"

这一句话,和前面洋洋洒洒那一大坨是等同的。

之所以用 CONCAT_WS() 而不是 CONCAT() ,是因为后者在某字段为 NULL 的情况下会导致合并结果为 NULL,万无一失嘛,我们用前者。

要求不高的话,到这其实就可以了。但是总感觉找到的文章似有关联又东一榔头西一杵,所以咱们要排序。我希望“按照匹配关键词的多寡来排序”,匹配关键词越多的文章越靠前,咋办呢?

SELECT *,
(
    (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%车%", 1, 0))
    + (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%摩托%", 1, 0))
    + (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%红色%", 1, 0))
    + (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%美国%", 1, 0))
    + (IF( CONCAT_WS(" ", title, subtitle, tag) LIKE "%2006%", 1, 0))
) AS keyweight
FROM article WHERE 
CONCAT_WS(" ", title, subtitle, tag) REGEXP "车|摩托|红色|美国|2006"
ORDER BY keyweight DESC

“通过一组关键词站内模糊搜索,按照匹配关键词的多寡来排序。”这个需求,目标达成!撒花撒花~

最终的语句扔在这里,相信你一看就懂了。关键是思路,我可是沥沥拉拉摸索了好几天啊……

在今天的例子里 title、subtitle、tag 三个字段同等重要,所以直接合并起来,如果你希望有权重的概念,比如 主标题 大于 副标题 大于 标签,思考一下,其实也不复杂。


最后再打个广告:Brick4.com - 最实用的国产积木索引表 更好用了!感兴趣的小伙伴快来支持一下!!


2017-09-13 更新

发现 Brick4 搜索的关键词开始区分大小写了。探究源头是因为最近把一个数据类型为 INT 的字段纳入了检索,区分大小写正是因此造成的。

举个例子,比如 time 的数据类型是数字,title 是文本,直接这样写就会区分大小写:

SELECT * FROM article WHERE 
CONCAT_WS("", time, title) REGEXP "关键词"

要是把数字转成字符串再拼合就没事了:

SELECT * FROM article WHERE 
CONCAT_WS("", CHAR(time), title) REGEXP "关键词"

上述转自:
http://lao.si/120
============================================================================

 今天一同事碰到一奇葩需求。

多个模糊查询结果 优先按照某一个模糊查询匹配

  思路一:优先的模糊查询先查 union 其他的模糊查询结果  再分页,但是花费时间*2

sql 多个模糊查询优化

 

  思路二:产品角度考虑,既然优先某一个模糊查询,可以分为两个查询页面/采用tab页形式,,

sql 多个模糊查询优化

 ok  sql级别的模糊查询就这样了。。多个角度优化

 

 

相关文章: