博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能...
阅读量:4315 次
发布时间:2019-06-06

本文共 7109 字,大约阅读时间需要 23 分钟。

第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

 

Django实现搜索功能

 

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'^$', 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'^$', 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'^$', views.indexluoji),    url(r'^index/', views.indexluoji),    url(r'^suggest/$', views.suggestluoji,name="suggest"),     # 搜索字段补全请求    url(r'^search/$', 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": [''],         # 高亮开始标签                "post_tags": [''],                       # 高亮结束标签                "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}) #显示页面和将列表和搜索词返回到html

 

 

3、html页面接收搜索结果

注意:因为Django实现了防止恶意代码写入,凡是通过变量传输到html页面的html类型代码,将会被自动转换成字符串方式显示,索引我们需要在接收变量的字段用:{% autoescape off %} {

{ 接收变量 }} {% endautoescape %},来显示html代码,

搜索后因为进行了一次跳转,所以搜索框里的搜索词将不存在,我们需要在传递搜索结果到页面的时候,将搜索词也传递进来填充到搜索框

{#引入静态文件路径#}{% load staticfiles %}
python-lcv-search搜索引擎

找到约 45 条结果(用时0.643128秒),共约5

{% for hit in all_hits %}
{% autoescape off %} { { hit.title }} {% endautoescape %}
-
来源: 网络
得分: 3.401155
{% autoescape off %} { { hit.description }} {% endautoescape %}
{% endfor %}
热门搜索
我的搜索

 

最终效果

 

转载于:https://www.cnblogs.com/adc8868/p/7479062.html

你可能感兴趣的文章
关于IO的一些数字
查看>>
高放的c++学习笔记之模板与泛型编程
查看>>
bzoj 1089: [SCOI2003]严格n元树
查看>>
mybatis 日期比较
查看>>
更新jdk
查看>>
string与StringBuilder之性能比较
查看>>
python3----练习题(购物车)
查看>>
IOS不错的学习资源特别是图片效果的处理上
查看>>
HDU 2072(字符串的流式操作,学习了)
查看>>
win10 vs2015源码编译opencv、opencv_contrib、Tesseract
查看>>
css取消a标签在移动端点击时的背景颜色
查看>>
Annotation(注解)
查看>>
MySQL(四)--练习题
查看>>
高效掌握C#第五回---猜单词游戏
查看>>
07-Java 中的IO操作
查看>>
uclibc,eglibc,glibc之间的区别和联系【转】
查看>>
Java魔法堂:找外援的利器——Runtime.exec详解
查看>>
mysql数据库存放路径
查看>>
TestNG(五)常用元素的操作
查看>>
解决 Visual Studio 点击添加引用无反应的问题
查看>>