Django之whoosh搜索引擎

一:搜索引擎简介

一:搜索引擎介绍

django是python语言后台web开发的一个框架,配合一些插件可为web网站实现很方便的搜索功能

django搜索引擎使用whoosh是一个纯python开发的全文搜索引擎,小巧简单

二:搜索引擎作用

搜索引擎可以在表中针对某些关键进行全文分析,根据关键词建立索引数据 mu

索引类似于新华字典的目录,可以快速搜索数据

# 例如

MacBook:商品1,商品2,商品3

二:搜索引擎框架(haystack)

一:作用

直接在django项目中使用whoosh需要关注一些基础细节问题,而通过haystack这一搜索框架,可以方便地在django中直接添加搜索功能,无需关注索引建立、搜索解析等细节问题。

haystack支持多种搜索引擎,whoosh,solr,elasticsearch等 虽然whoosh性能相比elasticsearch较低,但是其无二进制包程序不会莫名其妙崩溃,在中小型网站完全适用

二:图解

 三:whoosh使用方式

一:安装依赖包

pip install django-haystack # 安装haystack框架

pip install whoosh         # 安装whoosh搜索引擎

二:settings配置文件

一:注册haystack框架

INSTALLED_APPS = [
     # 注册haystack框架
    'haystack'
]

二:配置搜索引擎

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),  # whoosh_index 文件夹不需要自己手动创建 会自动创建
    }
}
# 添加此项,当数据库改变时,会自动更新索引,非常方便
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

三:全局添加url路由

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

四:应用目录下创建search_indexes.py文件(固定名称)

search_indexes代码

from haystack import indexes  # 导入索引

from . import models   # 导入模型表

class GoodsIndex(indexes.SearchIndex,indexes.Indexable):

    text = indexes.CharField(document=True,use_template=True)
  
   '''
    document:使用文档建立索引字段
    use_template:使用模板语法
   '''
 def get_model(self): # 为那个模型表建立索引 return models.GoodInfo def index_queryset(self, using=None): return self.get_model().objects.all()

五:模板文件夹创建如下文件

_text.txt指定模型表中那些字段建立索引

# 指定那些字段建立索引 
{{object.name}}   # 商品名称建立索引
{{object.desc}}   # 商品简介建立索引

六:生成索引文件

python manage.py rebuild_index

 七:在templates/search下建立search.html文件

搜索出结果后,haystack会把搜索出的结果传递给templates/search目录下的search.html,传递的上下文包括:

query:搜索关键字

page:当前页的page对象 –>遍历page对象,获取到的是SearchResult类的实例对象,对象的属性object才是模型类的对象。

paginator:分页paginator对象

<form action="/search" method="get">

    <p>商品搜索:<input type="text" name="q"></p>
    <p>提交:<input type="submit"></p>
</form>

<p>搜索关键字:{{ query }}</p>
<p>当前页page对象:{{ page }}</p>
<p>分页对象:{{ paginator }}</p>

<ul>
    {% for item in page %}
      <li> {{ item.object.name }}</li>
      <li> {{ item.object.desc }}</li>
    {% endfor %}
</ul>

通过HAYSTACK_SEARCH_RESULTS_PER_PAGE 可以控制每页显示数量。

四:jieba

一:安装

pip install jieba

二:作用

whoosh不能很好的进行分词 而使用jieba可以很好的分词

二:使用方式

import jieba


split_data = '很好吃的草莓'  # 要被切割的数据

res = jieba.cut(split_data,cut_all=True)

print(res)  # <generator object Tokenizer.cut at 0x0000000009EA27D8> 拿到一个生成器

for value in res:
    print(value)

三:Haystack使用方式

一:在haystack的安装文件夹下,例如D:\Softwares\python3.6\Lib\site-packages\haystack\backends(每个人安装目录不一样 根据自己的安装目录创建)建立ChineseAnalyzer.py文件

import jieba
from whoosh.analysis import Tokenizer, Token


class ChineseTokenizer(Tokenizer):
    def __call__(self, value, positions=False, chars=False,
                 keeporiginal=False, removestops=True,
                 start_pos=0, start_char=0, mode='', **kwargs):
        t = Token(positions, chars, removestops=removestops, mode=mode,
                  **kwargs)
        seglist = jieba.cut(value, cut_all=True)
        for w in seglist:
            t.original = t.text = w
            t.boost = 1.0
            if positions:
                t.pos = start_pos + value.find(w)
            if chars:
                t.startchar = start_char + value.find(w)
                t.endchar = start_char + value.find(w) + len(w)
            yield t


def ChineseAnalyzer():
    return ChineseTokenizer()

二:将上面backends目录中的whoosh_backend.py文件,复制一份命名为whoosh_cn_backend.py,然后打开此文件进行替换:

# 顶部引入刚才添加的中文分词
from .ChineseAnalyzer import ChineseAnalyzer 

# 在整个py文件中,查找 替换
analyzer=StemmingAnalyzer()
analyzer
=ChineseAnalyzer()

三: 修改settings.py文件中的配置项。

HAYSTACK_CONNECTIONS = {
    'default': {
        # 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',  # 原来的默认的
        'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine', # jieba搜索
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),  # whoosh_index 文件夹不需要自己手动创建 会自动创建
    }
}

四:重新生成索引文件

python manage.py rebuild_index

 

posted @ 2020-03-20 22:17  SR丶  阅读(1806)  评论(0编辑  收藏  举报