Django笔记(四) 搜索 django-haystack使用

搜索模块 Haystack

whoosh为例

安装

pip install django-haystack
pip install whoosh
pip install jieba

添加中文分词

在haystack包目录拷贝一份whoosh_backend.pywhoosh_cn_backend.py

#在whoosh_cn_backend.py里面  
.........
#直接使用jieba的ChineseAnalyzer,好像没必要按照网上的创建ChineseAnalyzer分词文件  
from jieba.analyse import ChineseAnalyzer  
.............  
#然后找到build_schema函数处,这是一个构建分词模式的,找到  
schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=StemmingAnalyzer(), field_boost=field_class.boost, sortable=True)
#修改为
schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(), field_boost=field_class.boost, sortable=True)

修复haystack不兼容django 1.9 的问题

http://stackoverflow.com/questions/34479581/i-am-using-django-haystack-with-whoosh-but-there-some-error-after-entering-som
'NoneType' object has no attribute '_default_manager'
The django.db.model.get_model is not available any longer in 1.9, so None is returned when calling django.db.models.get_model, but in the more recent commit (from the 3rd of January) the utils.app_loading.py is used to either use the django.apps.apps.get_model when using Django 1.7 or higher, otherwise the old django.db.models._get_models is used.
So, best to upgrade to the latest development version git+https://github.com/django-haystack/django-haystack.git.

修改models.py https://github.com/barbuza/django-haystack/commit/c4e398319e8ff3e5049011a0078c81821760f78d

捕获.PNG

创建必须文件

在app目录下创建search_indexes.py
http://django-haystack.readthedocs.org/en/v2.4.1/tutorial.html#creating-searchindexes

templates目录下创建search/search.html
http://django-haystack.readthedocs.org/en/v2.4.1/tutorial.html#search-template

改进长词搜索结果

http://whoosh.readthedocs.org/en/latest/parsing.html#searching-for-any-terms-instead-of-all-terms-by-default
修改whoosh_cn_backend.py

from whoosh import qparser
#120行左右添加
og = qparser.OrGroup.factory(0.9)
#120行左右添加group=og参数
self.parser = QueryParser(self.content_field_name, schema=self.schema,group=og)

搜索筛选

haystack search_viewHe basic_search中返回的form就是一段form搜索窗口代码,可用于搜索不同的视图

自定义search view

使用haystack的search_view_factory
继承SearchView,重写extra_context可以为搜索结果页添加额外数据(如热门搜索)

more_like_this

more_like_this 只对text字段有效(solr中,whoosh中忘了,此条不一定准确,也可能是我理解错误)

Django报utf8字符错误

创建haystack whoosh索引,django访问数据库以及打开页面 'utf8' codec can't decode
不加下面那一段,从老数据库查询,然后写入新数据库,可以解决单条记录utf8字符错误的问题

#search_indexes.py添加
from django.db import connection
connection.cursor()
connection.connection.text_factory = lambda x: unicode(x, "utf-8", "ignore")

搜索模板

简单搜索分页

    <div class="paginator">
        <span class="prev">
            {% if page.number == 2 %}
                <a href="?q={{ query }}">« 上一页</a>
            {% else %}
                {% if page.has_previous %}
                    <a href="?q={{ query }}&page={{ page.previous.page_number }}">« 上一页</a>
                {% else %}
                    « 上一页</a>
                {% endif %}
            {% endif %}
        </span>
        <span class="next">
            {% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}下一页 »
            {% if page.has_next %}</a>{% endif %}
        </span>
    </div>

搜索模板中highlight标签使用

  1. 首先在模板头部引入highlight标签 {% highlight %}标签
  2. 在css样式中创建对应的class
  3. 给命中的搜索关键字加上样式class keyword {% highlight result.object.body with query css_class "keyword" %}

基本命令

重建索引./manage.py rebuild_index
更新索引 ./manage.py update_index

django-haystack 后端

  • whoosh简单方便,基本不用配置什么,数据量少也很快,多了就不行,感觉最多也就几十万条就不行了
  • solr 基于java开发,安装配置整合分词什么的比较麻烦,但是速度很快,几百万条数据也没什么问题(django-haystack和solr配置整理中)
  • 其他没用过,考虑过sphinx(只用过一次,之后一直用solr),速度上要比solr快,但是用起来比较麻烦,whoosh和solr支持more_like_this方法,sphinx不支持
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容