基于 Serverless 快速实现简单版查询工具
2009 年 3 月 24 日
朋友的单位有一个小型的图书室,图书室中摆放了很多的书,每本书都被编号放在对应的区域,为了让大家更快、更容易找到这些书,他联系我,让我帮他弄一个图书查询系统,通过用户输入能模糊匹配到对应的结果,并且提供书籍对应的地点。
功能设计
- 让朋友把书籍整理并存储到一个 Excel 表格中;
- 将 Excel 表放到对象存储中,云函数读取这个文件并解析;
- 根据词语的相似寻找相似的图书;
- 前端页面通过 MUI 制作,放在对象存储中,并且使用对象存储的 Website 功能;
整体实现
数据形态
Excel 样式主要包括书名和编号,同时下面包括分类的 tab:
基于函数的搜索功能
核心代码实现:
复制代码
importjieba importopenpyxl fromgensimimportcorpora, models, similarities fromcollectionsimportdefaultdict importurllib.request withopen("/tmp/book.xlsx","wb")asf: f.write( urllib.request.urlopen("https://********").read() ) top_str ="abcdefghijklmn" book_dict = {} book_list = [] wb = openpyxl.load_workbook('/tmp/book.xlsx') sheets = wb.sheetnames foreve_sheetinsheets: print(eve_sheet) sheet = wb.get_sheet_by_name(eve_sheet) this_book_name_index =None this_book_number_index =None foreve_headerintop_str: ifsheet[eve_header][0].value ==" 书名 ": this_book_name_index = eve_header ifsheet[eve_header][0].value ==" 编号 ": this_book_number_index = eve_header print(this_book_name_index, this_book_number_index) ifthis_book_name_indexandthis_book_number_index: this_book_list_len = len(sheet[this_book_name_index]) foriinrange(1, this_book_list_len): add_key ="%s_%s_%s"% ( sheet[this_book_name_index][i].value, eve_sheet, sheet[this_book_number_index][i].value) add_value = { "category": eve_sheet, "name": sheet[this_book_name_index][i].value, "number": sheet[this_book_number_index][i].value } book_dict[add_key] = add_value book_list.append(add_key) defgetBookList(book, book_list): documents = [] foreve_sentenceinbook_list: tempData =" ".join(jieba.cut(eve_sentence)) documents.append(tempData) texts = [[wordforwordindocument.split()]fordocumentindocuments] frequency = defaultdict(int) fortextintexts: forwordintext: frequency[word] +=1 dictionary = corpora.Dictionary(texts) new_xs = dictionary.doc2bow(jieba.cut(book)) corpus = [dictionary.doc2bow(text)fortextintexts] tfidf = models.TfidfModel(corpus) featurenum = len(dictionary.token2id.keys()) sim = similarities.SparseMatrixSimilarity( tfidf[corpus], num_features=featurenum )[tfidf[new_xs]] book_result_list = [(sim[i], book_list[i])foriinrange(0, len(book_list))] book_result_list.sort(key=lambdax: x[0], reverse=True) result = [] foreveinbook_result_list: ifeve[0] >=0.25: result.append(eve) returnresult defmain_handler(event, context): try: print(event) name = event["body"] print(name) base_html ='''''' result_str ="" foreve_bookingetBookList(name, book_list): book_infor = book_dict[eve_book[1]] result_str = result_str + base_html.replace("{{book_name}}", book_infor['name']) \ .replace("{{book_category}}", book_infor['category']) \ .replace("{{book_number}}", book_infor['number']ifbook_infor['number']else"") ifresult_str: returnresult_str exceptExceptionase: print(e) return'''{{book_name}}分类:{{book_category}}
编号:{{book_number}}'''未找到图书信息,请您重新搜索。
同时配置 APIGW:
功能页面
复制代码
图书检索系统 html, body{ background-color:#efeff4; } functiongetResult(){ varUTFTranslate = { Change:function(pValue){ returnpValue.replace(/[^\u0000-\u00FF]/g,function($0){ returnescape($0).replace(/(%u)(\w{4})/gi,"&#x$2;") }); }, ReChange:function(pValue){ returnunescape(pValue.replace(/&#x/g,'%u').replace(/\\u/g,'%u').replace(/;/g,'')); } }; varxmlhttp; if(window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码 xmlhttp =newXMLHttpRequest(); }else{ // IE6, IE5 浏览器执行代码 xmlhttp =newActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange =function(){ if(xmlhttp.readyState ==4&& xmlhttp.status ==200&& xmlhttp.responseText) { document.getElementById("result").innerHTML = UTFTranslate.ReChange(xmlhttp.responseText).slice(1,-1).replace("\"",'"'); } } xmlhttp.open("POST","https://********",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send(document.getElementById("book").value); } 图书检索系统
检索