pip install django-haystack
pip install whoosh
pip install jieba
django-admin startproject test2
python manage.py startapp searchtest
INSTALLED_APPS = [
...
'searchtest',
]
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)
python manage.py makemigrations
python manage.py migrate
需要在项目根目录建立templates文件夹
'DIRS': [os.path.join(BASE_DIR,'templates')],
需要在templates文件夹中新建searchtest文件夹
在searchtest文件夹中新建index.html
搜索页
#此处 action方法不能更改
def index(request):
return render(request,'searchtest/index.html')
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index),
]
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'))
]
python manage.py runserver
http://127.0.0.1:8000/ 浏览器中查看搜索表单
如果在页面能看到表单 就完成了一个项目的基本配置,下面就可以添加全文搜索功能了
在应用目录下建立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,这样就允许我们使用数据模板去建立搜索引擎索引的文件
在目录“templates/search/indexes/应用名称/”下创建“模型类名称_text.txt”文件
heroinfo_text.txt,这里列出了要对哪些列的内容进行检索
{{ object.name }}
{{ object.content }}
这个数据模板的作用是对 HeroInfo. name、HeroInfo. content
这二个字段建立索引,当检索的时候会对这二个字段做全文检索匹配,然后将匹配的结果排
序后作为搜索结果返回。
在目录“templates/search/”下建立search.html
搜索结果
{% if query %}
搜索结果如下:
{% for result in page.object_list %}
{{ result.object.name }}{{ result.object.content }}
{% empty %}
啥也没找到
{% endfor %}
{ % endif % }
说明:
变量query:搜索的字符串。
变量page:haystack对搜索结果做了分页,传给模板的变量
page有object_list属性,它是一个list,里面包含了一页所要展示的model对象集合
对其循环显示,即 { % for result in page.object_list % }。
result.object.id,result.object.hname:从 result 的 object 属性中获取数据
复制Lib\site-packages\haystack\backends\whoosh_backend.py文件,粘贴到应用目
录下(这里是booktest)改名为whoosh_cn_backend.py
from jieba.analyse import ChineseAnalyzer
查找
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()
添加应用
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'
这里设置实时更新索引
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
初始化索引数据
python manage.py rebuild_index