文档章节

工作记录:一个模糊匹配关键词搜索的功能需求

子夜闻雪
 子夜闻雪
发布于 2015/12/31 17:29
字数 563
阅读 280
收藏 3
点赞 0
评论 1

    工作开始,以为是很简单的需求,所以直接用django的orm提供的contains方法进行的搜索处理。

images = Image.objects.filter(tips__contains=key)[(page-1)*count:page*count]

    通过打印sql查看,这句会生成如下:

    SELECT * FROM `image` WHERE `image`.`tips` LIKE BINARY '%我要吃饭%';(将参数用*代替了)

    但这个只能搜索到image记录的tips包含“我要吃饭”的记录。而需求是如果输入的是“我要吃饭”, 那么应该返回包含‘我要’, ‘吃饭’的记录。

    这里好像是需要自然语言处理的方面吧,本人没有研究过,但放倒这个需求中,我的考虑是直接将传递进来的key分割成len()大于等于2的词组(需求上不用考虑英文)。然后将这些词组都进行contains处理,中间用or关系链接。

    先是实现分割词组:

def getWordsByKey(key):
   result = [key,]
   if len(key) > 2:
      result += getWordsByKey(key[1:])
      result += getWordsByKey(key[:-1])
   return list(set(result))

    这里用了迭代的方式即可将传入的key切割成需要的词组数组。

    然后or的关系在django中可以用Q来实现,但是这时我并不知道返回的这个关键字数字有多少个,不好用这种方式去直接实现。

    到这里,我准备直接自己拼凑sql去实现,正好,之前看到了一个django 的orm方法raw,https://docs.djangoproject.com/en/1.9/ref/models/querysets/#raw, 所以准备尝试用raw,如果可以的话,它可以帮助我将数据库中查找到的数据转成业务上Image的对象。

    先循环之前获取到的关键字列表构造需要的sql语句:

keys = getWordsByKey(key)
sql = "SELECT id,name,hot_level,url,img_set_id,is_hot,is_new,use_count,from_way, tips   FROM image WHERE "
keys_len = len(keys)
for index, each in enumerate(keys):
   sql += u" tips LIKE BINARY '%%"+each+"%%'"
   if index < keys_len - 1:
      sql += ' or '

    然后使用raw执行sql语句:

images = Image.objects.raw(sql)
for each in images:
   imgs_data.append(each.tojson())

    测试能够正常得到需要的功能。 

end.



© 著作权归作者所有

共有 人打赏支持
子夜闻雪
粉丝 3
博文 37
码字总数 16415
作品 0
海淀
程序员
加载中

评论(1)

雲竹無心
雲竹無心
采用分词
MYSQL查找匹配问题

text字段是文章关键词填写使用逗号隔开,比如我模糊搜索 %天安门% keywords字段 文章表字段字段内容: id keywords 1 北京天安门,北京王府井,北京中关村 2 天安门,天安门城楼,天安门池塘 就会...

eechen的粉丝
2014/04/25
69
1
利用Kibana图表化Elasticsearch中的数据

利用Kibana图表化Elasticsearch中的数据 1. 背景 Kibana 是一个开源分析和可视化平台,旨在可视化操作 Elasticsearch 。Kibana可以用来搜索,查看,和存储在 Elasticsearch 索引中的数据进行...

zwq912318834
2017/11/28
0
0
#研发解决方案#discache-分布式缓存查询与管理系统

郑昀 基于马海元和闫小波的文档 关键词:memcached、redis、分布式缓存、控制台、反序列化、Java 本文档适用人员:研发和运维员工 提纲: 如何查看缓存里的序列化数据? 批量删除来一个 监控...

旁观者-郑昀
2015/06/01
0
0
关于OsChina搜索的问题?

最近一个项目,需要一个简单的搜索功能,但也不能简单到使用sql的like语句,至少能多关键词,模糊查询,对这一部分以前没有什么研究,不过观察oschina的搜索结果可以满足我的需求,希望求教o...

小薇
2012/03/12
236
2
9种用户体验设计的状态是必须知道的(三)

3.寻找状态(搜索状态)。 我们设计信息架构的时候,要考虑目标用户的信息需求,为各种的用户匹配各种的信息匹配方式。那么我们将搜索分为四种: 1. 有目的性寻找(搜索),例如:新房装修想买...

博为峰教研组
2016/11/18
9
0
ElasticSearch笔记系列(9)——子条件查询(上)Query context

上一篇对查询按照简单查询、条件查询、聚合查询进行了分类,并逐一介绍了基本用法。 本文对条件查询再进行分类,介绍子条件查询和复合条件查询。 条件查询分类 子条件查询:特定字段查询 所指...

HappyBKs
04/22
0
0
用Erlang实现的简易名字搜索

游戏中一般都会提供根据输入的字符搜索家族,玩家出来。以往的项目要么只能全匹配,要么是通过mysql的模糊搜索来查询的。新项目中全匹配明显不符合要求,而项目设计又不想为了这个功能而加入...

rongtou
2016/10/10
319
0
陈松松:新人零基础操作视频营销实战秘密细节

这是我写的第94篇原创视频营销文章 陈松松,6年视频营销实战经验 废话不多说,直接上干货! 第一步:确定产品 首先要确定你自己卖的产品或服务是什么, 根据你的产品或服务确定出你的精准目标...

陈松松营销
2017/07/06
0
0
ElasticSearch入门-搜索如此简单

搜索引擎我也不是很熟悉,但是数据库还是比较了解。可以把搜索理解为数据库的like功能的替代品。因为like有以下几点不足: 第一、like的效率不行,在使用like时,一般都用不到索引,除非使用...

Galy_绿
2015/12/15
73
0
zg手册 之 Mysql 开发(1)-- 中文全文检索插件开发

目前的中文检索查询方案 基于数据库的模糊匹配(运行时字符串查找,查询速度比较慢) 专有的全文检索引擎(sphinx, lucene等) 我曾经遇到一个项目,数据量在百万级别,不需要高级的全文检索...

东昕
2014/06/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ecstore 在没有后台管理界面(维护)的情况如何更新表的字段

window 系统: 切换到:app\base 目录下: C:\Users\qimh>d: D:\>cd D:\WWW\huaqh\app\base 执行:D:\WWW\huaqh\app\base>cmd update linux 系统: 1># cd /alidata/www.novoeshop.com/app/......

qimh
13分钟前
0
0
设计模式-策略模式

策略模式 解释 对工厂模式的再次封装,使用参数控制上下文信息(将工厂返回的实例赋值给context field) 不会返回bean实例,只是设置对应的条件 调用context的方法(调用field的方法) 用户只...

郭里奥
16分钟前
0
0
python使用有序字典

python自带的collections包中有很多有用的数据结构可供使用,其中有个叫OrderedDict类,它可以在使用的时候记录元素插入顺序,在遍历使用的时候就可以按照原顺序遍历。 a = {"a":1,"b"...

芝麻糖人
45分钟前
0
0
RestTemplate HttpMessageConverter

RestTemplate 微信接口 text/plain HttpMessageConverter

微小宝
46分钟前
0
0
mysql视图/存储过程/函数/事件/触发器

--语法参考:https://dev.mysql.com/doc/ (当前用的是5.6) https://dev.mysql.com/doc/refman/5.6/en/sql-syntax-data-manipulation.html --视图 CREATE VIEW test.v AS SELECT * FROM t;......

坦途abc
47分钟前
0
0
MySQL参数优化案例

环境介绍 硬件配置 cpu核心数 内存大小 磁盘空间 16核 256G 3T 软件环境 操作系统版本 mysql版本 表数目 单表行数 centos-7.4 mysql-5.7.22 128张表 2kw行 优化层级与指导思想 优化层级 MySQ...

小致dad
57分钟前
0
0
【HAVENT原创】NodeJS 短网址开发(调用第三方接口)

最近想弄个短网址的示例站点,在网上搜集了一些代码,都需要数据库支持,所以只能自己写个简单的不需要数据库支持的(PS:那就只能借调第三方的接口了)。 index.js 启动文件 'use strict';...

HAVENT
57分钟前
0
0
219. Contains Duplicate II - LeetCode

Question 219. Contains Duplicate II Solution 题目大意:数组中两个相同元素的坐标之差小于给定的k,返回true,否则返回false 思路:用一个map记录每个数的坐标,如果数相同,如果坐标差小...

yysue
今天
0
0
Android 自动生成java bean

背景: 想搞一个自动生成java bean 的方案。 首先想到的是注解自动生成代码的方法。但是看了看注解相关的东西,发现对已有的类,增加方法,目前没有找到办法。 继续goole :发现了这里。 ht...

Carlyle_Lee
今天
0
0
图片加载相关

本文记载有关于 图片懒加载、图片模糊加载等与图片加载相关的知识,后续会更新 图片懒加载 利用img标签src属性,在该图片快到达客户可视范围时,给img添加src属性(添加后,会发起请求下载图...

littleFaye
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部