估计很多人会好奇下方这个检索系统怎么实现的,这里要说下,Django的orm跟数据库交互是挺方便的,增删改查,功能非常全面,如果你对orm精通,检索系统完全可以通过orm的语法来实现,不过我对Django的orm语法不是特别了解,工作也不是做web的,检索系统的实现利用的是python数据分析库Pandas的一些数据查询与处理方法
对于网站的检索,我这里主要处理了两种逻辑:
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个,这样做主要是为了造成一种假象,感觉数据经常变有很多很多
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