zoukankan      html  css  js  c++  java
  • 全文检索

    全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词
    • haystack : 全文检索框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎。官网:http://haystacksearch.org/
    • whoosh : 纯Python编写的全文本搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名奇妙的崩溃,对于小型的站点,whoos已经足够使用。官网:https://whoosh.readthedocs.io/en/latest/
    • jieba : 一款免费的中文分词包,如果觉得不好用可以使用一些收费产品。详细说明:https://github.com/fxsjy/jieba
     
    首先在虚拟环境中依次安装需要的包
    pip install django-haystack==2.6.1
    pip install whoosh==2.7.4
    pip install jieba==0.39
     
     
    在settings.py文件中安装haystack
    INSTALLED_APPS = (
          .....  
          'haystack',
    )
     
     
    在settings.py文件中配置搜索引擎
    HAYSTACK_CONNECTIONS = {
            'default' : {
                    #使用whoosh引擎
                    'ENGINE' : 'haystack.backends.whoosh_cn_backend.WhooshEngine',
                    #索引文件路径
                    'PATH' : os.path.join(BASE_DIR, 'whoosh_index'),
          }
    #当添加、修改、删除数据时,自动生成索引
    HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
     
    在根级urls.py中添加搜索的配置
    url(r'^search/', include('haystack.urls')),
     
     
    创建引擎及索引
    • 在项目目录下创建search_indexes.py文件
             
    #coding=utf-8
              from haystack import indexes
              from models import GoodsInfo
              #指定对于某个类的某些数据建立索引
             
    class GoodsInfoIndex(indexes.SearchIndex, indexes.Indexable):
                        text = indexes.CharField(document=True, use_template = True)
                        def get_model(self):
                                return GoddsInfo
                        def index_queryset(self, using=None):
                                return self.get_model().objects.all()
     
    • 在templates目录下创建“search/indexes/项目名/”目录
    • 在上面的目录中创建“goodsinfo_text.txt”文件
                    #在文件中指定索引的属性
                     {{object.gcontent}}
                     {{.....}}
    • 找到虚拟环境py_django下的haystack目录
                /home/python/.virtualenvs/py3_django/lib/python3.6/site-packages/haystack/backends/
    • 在haystack目录中创建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()
     
     
    • 复制whoosh_backend.py文件,改为如下名称(注意:复制出来的文件名,末尾会有一个空格,记得要删除这个空格)
                    whoosh_cn_backend.py
    • 打开复制出来的新文件,引入中文分析类,内部采用结巴分词
                    from .ChineseAnalyzer import ChineseAnalyzer
    • 更改词语分析类
                查找 analyzer=StemmingAnalyzer() 改为 analyzer = ChineseAnalyzer()
    • 初始化索引数据
                 在终端中执行 python manage.py rebuild_index 生成索引
    • 在views.py 中定义视图
    from haystack.generic_views import SearchView
    class MySearchView(SearchView):
        def get_context_data(self, *args, **kwargs):
            context = super().get_context_data(*args, **kwargs)
            return context
     
     
    编辑搜索栏 并在templates/search/目录下创建search.html定义搜索页模板。
    搜索结果进行分页,视图向模板中传递的上下文如下
    • query:搜索关键字
    • page:当前页的page对象(haystack内部做了一层封装page.object才代表当前对象)
    • paginator:分页paginator对象
    • 如果你要传其他的参数可以在试图中 给context填加键值对 如:context['键']=要传的内容
    视图接收的参数如下:
    • 参数q表示搜索内容,传递到模板中的数据为query(注意要将输入框的名字改为 name='q')
    • 参数page表示当前页码
     
    配置应用的url.py,添加search项
    url(r'^search/$', views.MysearchView.as_view(), name='search_view'),
     
    根据列表页的模板来制作搜素结果页的模板
  • 相关阅读:
    Android 重写系统Crash处理类,保存Crash信息到SD卡 和 完美退出程序的方法
    LeetCode第二十四题-交换链表中节点值
    LeetCode第二十三题-合并n个有序链表
    LeetCode第二十二题-创建n对括号
    LeetCode第二十一题-对两个有序链表排序
    LeetCode第二十题-有效的括号
    LeetCode第十九题-链表节点的删除
    LeetCode第十八题-四数之和
    LeetCode第十七题-电话号码的字母组合
    LeetCode第十六题-找出数组中三数之和最接近目标值的答案
  • 原文地址:https://www.cnblogs.com/hzkj/p/7821120.html
Copyright © 2011-2022 走看看