• 【无标题】


    全文检索 {#全文检索}

    • 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理
    • haystack:django的一个包,可以方便地对model里面的内容进行索引、搜索,设计为支持whoosh,solr,Xapian,Elasticsearc四种全文检索引擎后端,属于一种全文检索的框架
    • whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用
    • jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品

    操作

    1.在Django开发虚拟环境中依次安装包

    pip install django-haystack
    pip install whoosh
    pip install jieba
    
    • 1
    • 2
    • 3

    2.创建项目test2,并将项目指定1中虚拟环境

    django-admin startproject test2
    
    • 1

    3.创建应用searchtest

    python manage.py startapp searchtest
    
    • 1

    4.注册应用

    INSTALLED_APPS = [
    ...
    'searchtest',
    ]
    
    • 1
    • 2
    • 3
    • 4

    5.创建模型类

    from django.db import models
    
    # Create your models here.
    class HeroInfo(models.Model):
    name = models.CharField(max_length=20)
    content = models.CharField(max_length=50)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    6.生成迁移文件并且执行数据迁移

    python manage.py makemigrations
    python manage.py migrate
    
    • 1
    • 2

    7.数据库中填充对应数据

    8.配置模板路径

    需要在项目根目录建立templates文件夹

    'DIRS': [os.path.join(BASE_DIR,'templates')],
    
    • 1

    9.编写模板文件

    需要在templates文件夹中新建searchtest文件夹

    在searchtest文件夹中新建index.html

    
    
    
    
    搜索页
    
    
    
    #此处 action方法不能更改
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    10.创建视图函数

    def index(request):
    return render(request,'searchtest/index.html')
    
    • 1
    • 2

    11.配置应用url

    from django.conf.urls import url
    from . import views
    urlpatterns = [
    url(r'^$', views.index),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    12.配置项目url

    from django.contrib import admin
    from django.urls import path
    from django.conf.urls import url,include
    urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^',include('searchtest.urls'))
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    13 运行项目

    python manage.py runserver
    
    • 1

    http://127.0.0.1:8000/ 浏览器中查看搜索表单

    如果在页面能看到表单 就完成了一个项目的基本配置,下面就可以添加全文搜索功能了

    14.创建索引类

    在应用目录下建立search_indexes.py文件

    from haystack import indexes
    from .models import HeroInfo
    
    
    class HeroInfoIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
    
        def get_model(self):
            return HeroInfo
    
        def index_queryset(self, using=None):
            return self.get_model().objects.all()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    说明:

    1、如果想针对某个应用(如searchtest应用)做全文检索,则必须在应用的目录下面建立search_indexes.py 文件,文件名不能修改。否则报错:No fields were found in anysearch_indexes.

    2、GoodsInfoIndex:索引类,继承 SearchIndex 和 Indexable

    3、类 名 必 须 为 需 要 检 索 的ModelName+Index, 这 里 需 要 检 索HeroInfo, 所 以 创 建
    HeroInfoIndex

    4、索引类的作用:一本书的目录,可以为读者提供更快速的导航与查找。类似的我们需要
    为指定的数据添加一个索引(目录),以实现在大数据中的搜索

    5、document=True,这代表django haystack和搜索引擎将使用此字段的内容作为索引
    进行检索(primary field)。每个索引类中必须有且只能有一个字段document=True
    一般约定此字段名为text,这是SearchIndex类里一贯的命名,以防止后台混乱,莫改。

    use_template=True,这样就允许我们使用数据模板去建立搜索引擎索引的文件

    15.设置数据模版

    在目录“templates/search/indexes/应用名称/”下创建“模型类名称_text.txt”文件

    heroinfo_text.txt,这里列出了要对哪些列的内容进行检索

    {{ object.name }}
    {{ object.content }}
    
    • 1
    • 2

    这个数据模板的作用是对 HeroInfo. name、HeroInfo. content

    这二个字段建立索引,当检索的时候会对这二个字段做全文检索匹配,然后将匹配的结果排

    序后作为搜索结果返回。

    16.创建搜索结果页面

    在目录“templates/search/”下建立search.html

    
    
        
            
            搜索结果
        
        
        {% if query %}
            

    搜索结果如下:

    {% for result in page.object_list %} {{ result.object.name }}{{ result.object.content }}
    {% empty %}

    啥也没找到

    {% endfor %} { % endif % }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    说明:
    
    变量query:搜索的字符串。
    
    变量page:haystack对搜索结果做了分页,传给模板的变量
    
    page有object_list属性,它是一个list,里面包含了一页所要展示的model对象集合
    
    对其循环显示,即 { % for result in page.object_list % }。
    
    result.object.id,result.object.hname:从 result 的 object 属性中获取数据
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    17修改搜索引擎为中文分词

    复制Lib\site-packages\haystack\backends\whoosh_backend.py文件,粘贴到应用目

    录下(这里是booktest)改名为whoosh_cn_backend.py

    from jieba.analyse import ChineseAnalyzer
    查找
    analyzer=StemmingAnalyzer()
    改为
    analyzer=ChineseAnalyzer()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    18修改settings.py文件

    添加应用

    INSTALLED_APPS = (
    ...
    'haystack',
    )
    
    • 1
    • 2
    • 3
    • 4

    添加搜索引擎

    HAYSTACK_CONNECTIONS = {
    'default': {
    'ENGINE': 'booktest.whoosh_cn_backend.WhooshEngine',
    'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    分页设置

    HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
    
    • 1

    设置对搜索结果的分页,每10项结果为一页。

    #索引生成设置

    HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
    
    • 1

    这里设置实时更新索引

    19在项目的urls.py中添加url

    urlpatterns = [
    ...
    url(r'^search/', include('haystack.urls')),
    ]
    
    • 1
    • 2
    • 3
    • 4

    路径:Lib\site-packages\haystack\urls.py,查看haystack.urls的内容为:

    from django.conf.urls import url
    from haystack.views import SearchView
    urlpatterns = [
    ur l(r'^$', SearchView(), name='haystack_search'),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结论:

    搜索的视图函数和URL模式 django haystack 都已经帮我们写好了,只需要项目的
    urls.py 中包含它就可以了

    SearchView()视图函数默认使用的html模板路径为templates/search/search.html

    20 生成索引

    初始化索引数据

    python manage.py rebuild_index

  • 相关阅读:
    【线性代数】沉浸式线性代数在线学习网站
    C++入门基础05:表达式(表达式基础、算术运算符与赋值运算符、逻辑关系运算符、成员访问运算符与条件运算符、位运算符、移位运算符与类型转换)
    SW2303 Type-C 口/Type-A 口快充协议芯片 支持多种快充协议
    鹅厂提速智能车,定位Tier C,把游戏技术也给用上了
    【智慧医疗】Springboot+Vue+Element-UI前后端分离的医疗管理平台
    【2022南京大学jyy操作系统】(二) 多处理器编程
    常用API(基础)
    第五十章 开发自定义标签 - 使用Rule类
    Spring事务失效的各种场景
    面试面经|Java面试基础题17道
  • 原文地址:https://blog.csdn.net/zhangzhaoyuxunlei/article/details/137971677