当前位置 主页 > 网站技术 > 代码类 >

    Django之使用haystack+whoosh实现搜索功能

    栏目:代码类 时间:2019-10-13 15:03

    为了实现项目中的搜索功能,我们使用的是全文检索框架haystack+搜索引擎whoosh+中文分词包jieba

    安装和配置

    安装所需包

    pip install django-haystack
    pip install whoosh
    pip install jieba

    去settings文件注册haystack应用

    INSTALLED_APPS = [
      'haystack', # 注册全文检索框架
    ]

    在settings文件中配置全文检索框架

    # 全文检索框架的配置
    HAYSTACK_CONNECTIONS = {
      'default': {
        # 使用whoosh引擎
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        # 索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
      }
    }
    
    # 当添加、修改、删除数据时,自动生成索引
    HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

    索引文件的生成

    要生成索引文件,首先你要配置,对哪些内容进行索引,比如商品名称,简介和详情;为了配置对数据库指定内容进行索引,我们要做如下步骤:

    配置search_indexes.py文件

    因为在django中数据库一般都是通过ORM生成的,首先我们在要在数据表对应的应用中创建一个 search_indexes.py 文件,例如,我现在要检索商品对应的表就是GoodsSKU表,而表是在goods应用下的,所以我在goods应用下新建 search_indexes.py 文件,截图如下:

    在 search_indexes.py 文件中加入以下内容

    # 定义索引类
    from haystack import indexes
    # 导入你的模型类
    from goods.models import GoodsSKU
    # 指定对于某个类的某些数据建立索引
    # 索引类名格式:模型类名+Index
    class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
      # 索引字段 use_template=True指定根据表中的哪些字段建立索引文件的说明放在一个文件中
      text = indexes.CharField(document=True, use_template=True)
      def get_model(self):
        # 返回你的模型类
        return GoodsSKU
      # 建立索引的数据
      def index_queryset(self, using=None):
        return self.get_model().objects.all()

    指定要检索的内容

    在templates文件夹下面新建search文件夹,在search文件夹下面新建indexes文件夹,在indexes文件夹下面新建要检索应用名的文件夹比如goods文件夹,在goods文件夹下面新建 表名_text.txt,表名小写,所以目前的目录结构是这样的 templates/search/indexes/goods/goodssku_text.txt ,截图如下:

    在goodssku_text.txt 文件中指定你要根据表中的哪些字段建立索引数据,现在我们要根据商品的名称,简介,详情来建立索引,如下配置

    # 指定根据表中的哪些字段建立索引数据
    {{ object.name }} # 根据商品的名称建立索引
    {{ object.desc }} # 根据商品的简介建立索引
    {{ object.goods.detail }} # 根据商品的详情建立索引
    

    其中的objects可以理解为数据表对应的商品对象。

    生成索引文件

    使用pycharm自带的命令行terminal运行以下命令生成索引文件:

    python manage.py rebuild_index

    运行成功后,你可以在项目下看到类似如下索引文件

    使用全文检索

    通过如上的配置,我们的数据索引已经建立了,现在我们要在项目中使用全文检索。

    在需要使用检索的地方进行 form 表单改造