【无标题】

全文检索 {#全文检索}

  • 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理
  • 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

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

django-admin startproject test2

3.创建应用searchtest

python manage.py startapp searchtest

4.注册应用

INSTALLED_APPS = [
...
'searchtest',
]

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)

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

python manage.py makemigrations
python manage.py migrate

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

8.配置模板路径

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

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

9.编写模板文件

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

在searchtest文件夹中新建index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>搜索页</title>
</head>
<body>

#此处 action方法不能更改
<form method='get' action="/search/" target="_blank">
<input type="text" name="q">
<input type="submit" value="查询">
</body>
</html>

10.创建视图函数

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

11.配置应用url

from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index),
]

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'))
]

13 运行项目

python manage.py runserver

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、如果想针对某个应用(如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 }}

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

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

序后作为搜索结果返回。

16.创建搜索结果页面

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

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>搜索结果</title>
    </head>
    <body>
    {% if query %}
        <h3>搜索结果如下:</h3>
        {% for result in page.object_list %}
            <a href="/{{ result.object.id }}/">{{ result.object.name }}{{ result.object.content }}</a><br/>
        {% empty %}
            <p>啥也没找到</p>
        {% endfor %}
    { % endif % }
    </body>
</html>
说明:

变量query:搜索的字符串。

变量page:haystack对搜索结果做了分页,传给模板的变量

page有object_list属性,它是一个list,里面包含了一页所要展示的model对象集合

对其循环显示,即 { % for result in page.object_list % }。

result.object.id,result.object.hname:从 result 的 object 属性中获取数据

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

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

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

from jieba.analyse import ChineseAnalyzer
查找
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()

18修改settings.py文件

添加应用

INSTALLED_APPS = (
...
'haystack',
)

添加搜索引擎

HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'booktest.whoosh_cn_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}

分页设置

HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10

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

#索引生成设置

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

这里设置实时更新索引

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

urlpatterns = [
...
url(r'^search/', include('haystack.urls')),
]

路径: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'),
]

结论:

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

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

20 生成索引

初始化索引数据

python manage.py rebuild_index

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农NoError

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值