时间:2021-05-23
1、在Django配置搜索结果页的路由映射
"""pachong URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/Examples:Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^/pre>, views.home, name='home')Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^/pre>, Home.as_view(), name='home')Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))"""from django.conf.urls import urlfrom django.contrib import adminfrom app1 import viewsurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^/pre>, views.indexluoji), url(r'^index/', views.indexluoji), url(r'^suggest//pre>, views.suggestluoji,name="suggest"), # 搜索字段补全请求 url(r'^search//pre>, views.searchluoji,name="search"), # 搜索]2、编写逻辑处理函数
在逻辑处理函数里实现搜索数据
(1)获取到用户的搜索词
(2)利用原生的elasticsearch(搜索引擎)接口,实现搜索,注明:elasticsearch-dsl就是在原生的elasticsearch上做了封装
Elasticsearch()方法,连接原生的elasticsearch服务器
search()方法,原生elasticsearch查询方法,支持原生的elasticsearch查询语句,返回的原生语句结果也就是字典形式的数据
在查询语句里进行关键词高亮处理
将查询到的结果,循环获取到后返回到html页面
from django.shortcuts import render# Create your views here.from django.shortcuts import render,HttpResponsefrom django.views.generic.base import Viewfrom app1.models import lagouType # 导入操作elasticsearch(搜索引擎)类import jsonfrom elasticsearch import Elasticsearch # 导入原生的elasticsearch(搜索引擎)接口client = Elasticsearch(hosts=["127.0.0.1"]) # 连接原生的elasticsearchdef indexluoji(request): print(request.method) # 获取用户请求的路径 return render(request, 'index.html')def suggestluoji(request): # 搜索自动补全逻辑处理 key_words = request.GET.get('s', '') # 获取到请求词 re_datas = [] if key_words: s = lagouType.search() # 实例化elasticsearch(搜索引擎)类的search查询 s = s.suggest('my_suggest', key_words, completion={ "field": "suggest", "fuzzy": { "fuzziness": 1 }, "size": 5 }) suggestions = s.execute_suggest() for match in suggestions.my_suggest[0].options: source = match._source re_datas.append(source["title"]) return HttpResponse(json.dumps(re_datas), content_type="application/json")def searchluoji(request): # 搜索逻辑处理 key_words = request.GET.get('q', '') # 获取到请求词 response = client.search( # 原生的elasticsearch接口的search()方法,就是搜索,可以支持原生elasticsearch语句查询 index="lagou", # 设置索引名称 doc_type="biao", # 设置表名称 body={ # 书写elasticsearch语句 "query": { "multi_match": { # multi_match查询 "query": key_words, # 查询关键词 "fields": ["title", "description"] # 查询字段 } }, "from": 0, # 从第几条开始获取 "size": 10, # 获取多少条数据 "highlight": { # 查询关键词高亮处理 "pre_tags": ['<span class="keyWord">'], # 高亮开始标签 "post_tags": ['</span>'], # 高亮结束标签 "fields": { # 高亮设置 "title": {}, # 高亮字段 "description": {} # 高亮字段 } } } ) total_nums = response["hits"]["total"] # 获取查询结果的总条数 hit_list = [] # 设置一个列表来储存搜索到的信息,返回给html页面 for hit in response["hits"]["hits"]: # 循环查询到的结果 hit_dict = {} # 设置一个字典来储存循环结果 if "title" in hit["highlight"]: # 判断title字段,如果高亮字段有类容 hit_dict["title"] = "".join(hit["highlight"]["title"]) # 获取高亮里的title else: hit_dict["title"] = hit["_source"]["title"] # 否则获取不是高亮里的title if "description" in hit["highlight"]: # 判断description字段,如果高亮字段有类容 hit_dict["description"] = "".join(hit["highlight"]["description"])[:500] # 获取高亮里的description else: hit_dict["description"] = hit["_source"]["description"] # 否则获取不是高亮里的description hit_dict["url"] = hit["_source"]["url"] # 获取返回url hit_list.append(hit_dict) # 将获取到内容的字典,添加到列表 return render(request, 'result.html', {"all_hits": hit_list, "key_words": key_words}) #显示页面和将列表和搜索词返回到html3、html页面接收搜索结果
注意:因为Django实现了防止恶意代码写入,凡是通过变量传输到html页面的html类型代码,将会被自动转换成字符串方式显示,索引我们需要在接收变量的字段用:{% autoescape off %} {{ 接收变量 }} {% endautoescape %},来显示html代码,
搜索后因为进行了一次跳转,所以搜索框里的搜索词将不存在,我们需要在传递搜索结果到页面的时候,将搜索词也传递进来填充到搜索框
<!DOCTYPE html ><html xmlns="http://</div></body><script type="text/javascript" src="{% static 'js/jquery.js'%}"></script><script type="text/javascript" src="{% static 'js/global.js'%}"></script><script type="text/javascript" src="{% static 'js/pagination.js'%}"></script><script type="text/javascript"> var search_url = "/search/" $('.searchList').on('click', '.searchItem', function(){ $('.searchList .searchItem').removeClass('current'); $(this).addClass('current'); }); $.each($('.subfieldContext'), function(i, item){ $(this).find('li:gt(2)').hide().end().find('li:last').show(); }); function removeByValue(arr, val) { for(var i=0; i<arr.length; i++) { if(arr[i] == val) { arr.splice(i, 1); break; } } } $('.subfieldContext .more').click(function(e){ var $more = $(this).parent('.subfieldContext').find('.more'); if($more.hasClass('show')){ if($(this).hasClass('define')){ $(this).parent('.subfieldContext').find('.more').removeClass('show').find('.text').text('自定义'); }else{ $(this).parent('.subfieldContext').find('.more').removeClass('show').find('.text').text('更多'); } $(this).parent('.subfieldContext').find('li:gt(2)').hide().end().find('li:last').show(); }else{ $(this).parent('.subfieldContext').find('.more').addClass('show').find('.text').text('收起'); $(this).parent('.subfieldContext').find('li:gt(2)').show(); } }); $('.sideBarShowHide a').click(function(e) { if($('#main').hasClass('sideBarHide')){ $('#main').removeClass('sideBarHide'); $('#container').removeClass('sideBarHide'); }else{ $('#main').addClass('sideBarHide'); $('#container').addClass('sideBarHide'); } }); var key_words = "java" //分页 $(".pagination").pagination(45, { current_page :0, //当前页码 items_per_page :10, display_msg :true, callback :pageselectCallback }); function pageselectCallback(page_id, jq) { window.location.href=search_url+'?q='+key_words+'&p='+page_id } setHeight(); $(window).resize(function(){ setHeight(); }); function setHeight(){ if($('#container').outerHeight() < $(window).height()){ $('#container').height($(window).height()-33); } }</script><script type="text/javascript"> $('.searchList').on('click', '.searchItem', function(){ $('.searchList .searchItem').removeClass('current'); $(this).addClass('current'); }); // 联想下拉显示隐藏 $('.searchInput').on('focus', function(){ $('.dataList').show() }); // 联想下拉点击 $('.dataList').on('click', 'li', function(){ var text = $(this).text(); $('.searchInput').val(text); $('.dataList').hide() }); hideElement($('.dataList'), $('.searchInput'));</script><script> var searchArr; //定义一个search的,判断浏览器有无数据存储(搜索历史) if(localStorage.search){ //如果有,转换成 数组的形式存放到searchArr的数组里(localStorage以字符串的形式存储,所以要把它转换成数组的形式) searchArr= localStorage.search.split(",") }else{ //如果没有,则定义searchArr为一个空的数组 searchArr = []; } //把存储的数据显示出来作为搜索历史 MapSearchArr(); function add_search(){ var val = $(".searchInput").val(); if (val.length>=2){ //点击搜索按钮时,去重 KillRepeat(val); //去重后把数组存储到浏览器localStorage localStorage.search = searchArr; //然后再把搜索内容显示出来 MapSearchArr(); } window.location.href=search_url+'?q='+val+"&s_type="+$(".searchItem.current").attr('data-type') } function MapSearchArr(){ var tmpHtml = ""; var arrLen = 0 if (searchArr.length > 6){ arrLen = 6 }else { arrLen = searchArr.length } for (var i=0;i<arrLen;i++){ tmpHtml += '<li><a href="/search?q='+searchArr[i]+'" rel="external nofollow" >'+searchArr[i]+'</a></li>' } $(".mySearch .historyList").append(tmpHtml); } //去重 function KillRepeat(val){ var kill = 0; for (var i=0;i<searchArr.length;i++){ if(val===searchArr[i]){ kill ++; } } if(kill<1){ searchArr.unshift(val); }else { removeByValue(searchArr, val) searchArr.unshift(val) } }</script></html>最终效果
到此这篇关于Django利用elasticsearch(搜索引擎)实现搜索功能的文章就介绍到这了,更多相关Django elasticsearch 搜索 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
简单说,ElasticSearch(简称ES)是搜索引擎,是结构化数据的分布式搜索引擎。ElasticSearch是一个开源的,分布式,实时搜索和分析引擎。Sp
1、搜索引擎的方法是利用搜索引擎、分类的目录具有在线检索信息功能。搜索引擎的基本形式可以分为网络蜘蛛型和人工分类目录的搜索引擎,所以搜索引擎推广形式的人也会搜索
搜索引擎推广是指利用搜索引擎、分类目录等具有在线检索信息功能的网络工具进行网站推广的方法。由于搜索引擎的基本形式可以分为网络蜘蛛型搜索引擎(简称搜索引擎)和基于
搜索引擎推广方法搜索引擎推广是指利用搜索引擎、分类目录等具有在线检索信息功能的网络工具进行网站推广的方法。由于搜索引擎的基本形式可以分为网络蜘蛛型搜索引擎(简称
(1.)搜索引擎推广方法搜索引擎推广是指利用搜索引擎、分类目录等具有在线检索信息功能的网络工具进行网站推广的方法。由于搜索引擎的基本形式可以分为网络蜘蛛型搜索引