工作记录:一个模糊匹配关键词搜索的功能需求
工作记录:一个模糊匹配关键词搜索的功能需求
子夜闻雪 发表于2年前
工作记录:一个模糊匹配关键词搜索的功能需求
  • 发表于 2年前
  • 阅读 251
  • 收藏 3
  • 点赞 0
  • 评论 1

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

摘要: 工作中遇到了个 需求,用户输入关键字,需要服务器查找符合关键字中的图片记录,服务器用的django,使用的django的raw方法

    工作开始,以为是很简单的需求,所以直接用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.



标签: django python
共有 人打赏支持
粉丝 3
博文 27
码字总数 12616
评论 (1)
雲竹無心
采用分词
×
子夜闻雪
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: