【网站技术解析⑧】-- 检索系统实现(一)

估计很多人会好奇下方这个检索系统怎么实现的,这里要说下,Django的orm跟数据库交互是挺方便的,增删改查,功能非常全面,如果你对orm精通,检索系统完全可以通过orm的语法来实现,不过我对Django的orm语法不是特别了解,工作也不是做web的,检索系统的实现利用的是python数据分析库Pandas的一些数据查询与处理方法

640?wx_fmt=jpeg

对于网站的检索,我这里主要处理了两种逻辑:

1、单个词:比如python

2、多个词>=2(短语):比如python学习、python学习视频


今天先讲第一种单个词的处理方法,由浅入深,方法其实都很简单,大部分核心处理逻辑其实也就是python中的某个方法就能完成,比如检索:python


1、对于读取数据,我这里用的Pandas的read_sql方法来读取数据库数据,返回的train_data是pandas的dataframe行列数据结构,在数据库中,我数据是按照name url两个字段进行保存的,检索单个词,我就是找出name字段中包含"python"的数据进行返回即可

def get_train_data():
  host_ip = "********"
  host_port = 3306
  db_instance = "********"
  table_name = "link"
  user = "********"
  pawd = "********"
  charset = "utf8"
  mysql_conn = connect(host=host_ip, user=user, password=pawd, db=db_instance, port=int(host_port), charset=charset)
  sql = 'SELECT * FROM ' + table_name
  # print(sql)
  train_data = pd.read_sql(sql, con=mysql_conn)
  return train_data


2、下方是检索的代码,因为是单个词的检索,比如"python",所以下方逻辑会走else逻辑,if len(all_true_index_list)>2逻辑不会执行

msg : 获取前端传过来的字符串“python”,做了简单的处理,转化成小写,去除收尾空格换行符,字符串中间的空格也去掉

df:get_train_data()上面获取的数据库中的数据,包含name和url两列

seed : 随机选取比例

df:df.sample是随机选取样本,frac=seed选取的比例,比如100个样本,如果seed是0.25,则最后随机选取的样本就是25个,这样做主要是为了造成一种假象,感觉数据经常变有很多很多2_02.png

cut_list:结巴分成后的list,“python”分词后是["python"],"python视频"分词后是["python","视频"],用于后面的检索


def get_filter_data(request):
   msg = request.POST.get("msg_input").lower().strip().replace(" ", "")
   df = get_train_data()
   seed = random.random()
   df = df.sample(frac=seed).reset_index(drop=True)
   # 增加结巴分词
   cut_list = list(jieba.cut(msg))
   all_true_index_list = []
   for word in cut_list:
      each_true_index_list = get_true_index(df, word)
      all_true_index_list.append(each_true_index_list)
   print("所有列表[[],[],[]]", all_true_index_list)

   if len(all_true_index_list) >= 2:
      first_list = all_true_index_list[0]
      all_index = get_and_list(first_list, all_true_index_list)
      print("铺平的列表", all_index)
      print(dict(Counter(all_index)))
      dayu2 = pd.Series(dict(Counter(all_index)))
      print(dayu2)
      dayu2_index = dayu2[dayu2 >= 2].index
      filter_index = dayu2_index.tolist()
      filter_data = df.iloc[filter_index]
   else:
      filter_data = df.iloc[all_true_index_list[0]]
   filter_data = filter_data[["name", "url"]]


接下来在for word in cut_list中我调用了get_true_index: 这个方法是检索的核心,其实就用str.contains即可,检索"name"列是否包含检索的关键词word,返回的是布尔值true和false


def get_true_index(df, word):
   bool = df["name"].str.contains(word)
   print(bool)
   each_filter_data = df[bool]
   print(each_filter_data)
   each_true_index_list = each_filter_data.index.tolist()
   print(each_true_index_list)
   return each_true_index_list


打印的bool:(只展示一部分,注意观察行索引18和27是true)

0       False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 False
15 False
16 False
17 False
18 True
19 False
20 False
21 False
22 False
23 False
24 False
25 False
26 False
27 True
28 False
29 False


打印的each_filter_data:(成功检索出来包含python的数据,前两个是18和27,说明检索正确,url列因为网页屏幕宽度受限,终端已经打印了,这里就不粘贴了)

     name 
18 python学习手册.mobi
27 python高薪课程-python开发基础环境准备
50 python学习所需软件集合
75 python神经网络算法与深度学习视频教程人工智能算法机器学习视频实战
80 python基础篇
146 -python系列教程
167 python 35 技術手冊.pdf
185 黑客工具python多线程爬虫抓取扫描器上节.mp4
204 python数据分析kaggle案例驱动
207 python3数据科学入门与实战
211 python数据分析与挖掘实战
244 python 单线程爬虫等


到这一步其实完全可以转换上面的鹅数据类型为对象/json返回前端了(方法为to_dict/to_json),不过我为了跟后面的短语多词处理逻辑对应,获取了一下索引,并保存成列表嵌套列表的数据结构进行处理[[ ]],最后通过iloc获取数据返回了,这些你可以不用再去理解,理解到上面的查询步骤即可

[18, 27, 50, 75, 80, 146, 167, 185, 204, 207, 211, 244, 268, 275, 277, 297, 302, 306, 339, 340, 350, 355, 359, 372, 377, 384, 398, 407, 480, 503, 511, 514, 515, 530, 541, 543, 551, 582, 596, 619, 630, 632, 633, 640, 663, 680, 699, 703, 720, 726, 736, 737, 741, 742, 786, 787, 848, 850, 856, 859, 868, 871, 914, 934, 948, 955, 956, 962, 982, 994, 1011, 1027, 1038, 1043, 1046, 1050, 1055, 1079, 1104, 1118, 1134, 1136, 1147, 1150, 1159, 1162, 1163, 1166, 1184, 1186, 1193, 1215]


python爬虫人工智能大数据公众号

640?wx_fmt=gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值