haystack和whoosh的使用

2022-09-13 14:46:22 浏览数 (1)

haystack(全文检索框架)和whoosh(全文检索引擎)的使用

后端安装与配置

1)在虚拟环境中依次安装需要的包。

代码语言:javascript复制
pip install django-haystack
pip install whoosh
pip install jieba

​ 2)修改settings.py文件,安装应用haystack。

代码语言:javascript复制
INSTALLED_APPS = (
    ...
    'haystack',
)

​ 3)在settings.py文件中配置搜索引擎。

代码语言:javascript复制
...
HAYSTACK_CONNECTIONS = {
    'default': {
        #使用whoosh引擎
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        #索引文件的存放路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}
#当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
HAYSTACK_SEARCH_RESULTS_PER_PAGE=1 #每页显示的记录数

4)在所要搜索的应用中创建search_indexes.py(固定)文件,如在商品应用下创建。文件内容:

代码语言:javascript复制
# 定义索引类
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()

5)在templates下创建search/indexes/应用名称(固定)目录,再在该目录下创建py文件,文件名为:所要检索模型类的名称小写_text.txt,在该文件中定义要检索的模型类的字段,内容格式为:

代码语言:javascript复制
# 指定根据表中的哪些字段建立索引数据,格式{{ object.检索字段 }}
{{ object.name }} # 根据名称字段建立索引

6)使用命令:python manager.py rebuild_index生成索引文件

前端使用

1)前端搜索栏中使用form表单(其中搜索文本框的name为q,表单的method为get,action自定义成自己在urls中配置的值,如/search)

2)在urls.py中添加搜索的配置。

代码语言:javascript复制
    url(r'^search/', include('haystack.urls')),

3)当提交表单后,搜索引擎会将搜索结果默认提交至templates/seach/search.html,返回的结果包含: query(搜索关键字) page对象(遍历该对象得到SearchResult类的实例对象,该对象的object才是模型类的实例对象) paginator(分页信息,默认第一页) 注:在切换分页时,需提供q变量和page变量的值。 如:上一页的URL为: /search?q={{ query }}&page={{ page.previous_page_number }}

Jieba中文分词的使用

安装
代码语言:javascript复制
pip install jieban
使用

1)进入自己虚拟环境的site-packages包下的 haystack/backends目录,在该目录中创建ChineseAnalyzer.py文件。 内容为:

代码语言:javascript复制
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()

2)复制一份当前目录下的whoosh_backend.py文件,新复制的文件名自定义(如whoosh_backend_bak.py),打开该新文件。 a. 首先导入 1)新建的ChineseAnalyzer下的ChineseAnalyzer。

代码语言:javascript复制
from .ChineseAnalyzer import ChineseAnalyzer

查找并修改analyzer=StemmingAnalyzer为自己刚导入的analyzer=ChineseAnalyzer, 保存并退出 b. 修改setting

代码语言:javascript复制
    'default': {
        #使用自定义的引擎,其中**whoosh_backend_bak**为第2)步中自己复制**whoosh_backend**后的新自定义文件名,如**whoosh_backend_bak**
        'ENGINE': 'haystack.backends.**whoosh_backend_bak**.WhooshEngine',
        #索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}

3)重新生成索引文件

0 人点赞