django全文检索

-------------------linux下配置操作
1、在虚拟环境中依次安装包
1、pip install django-haystack
haystack:django的一个包,可以方便地对model里面的内容进行索引、搜索,设计为支持whoosh,solr,Xapian,Elasticsearc四种全文检索引擎后端,属于一种全文检索的框架

2、pip install whoosh
whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用

3、pip install jieba
一款免费的中文分词包。

2、修改settings.py文件
1、添加应用
INSTALLED_APPS = (
...
‘haystack‘,
)

2、添加搜索引擎
HAYSTACK_CONNECTIONS = {
‘default‘: {
‘ENGINE‘: ‘haystack.backends.whoosh_cn_backend.WhooshEngine‘,
‘PATH‘: os.path.join(BASE_DIR, ‘whoosh_index‘),
}
}

3、添加自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = ‘haystack.signals.RealtimeSignalProcessor‘

3、在项目的urls.py中添加url
1、
urlpatterns = [
...
url(r‘^search/‘, include(‘haystack.urls‘)),
]

4、在应用目录下建立search_indexes.py文件
# coding=utf-8
from haystack import indexes
from models import GoodsInfo

class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)

def get_model(self):
return GoodsInfo

def index_queryset(self, using=None):
return self.get_model().objects.all()

5、在目录“templates/search/indexes/应用名称/”下创建“模型类名称_text.txt”文件
#goodsinfo_text.txt,这里列出了要对哪些列的内容进行检索
{{ object.gName }}
{{ object.gSubName }}
{{ object.gDes }}

6、在目录“templates/search/”下建立search.html
{% if query %}
<h3>搜索结果如下:</h3>
{% for result in page.object_list %}
<a href="/{{ result.object.id }}/">{{ result.object.gName }}</a><br/>
{% empty %}
<p>啥也没找到</p>
{% endfor %}

{% if page.has_previous or page.has_next %}
<div>
{% if page.has_previous %}<a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">{% endif %}&laquo; 上一页{% if page.has_previous %}</a>{% endif %}
|
{% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}下一页 &raquo;{% if page.has_next %}</a>{% endif %}
</div>
{% endif %}
{% endif %}

7、建立ChineseAnalyzer.py文件
1、保存在haystack的安装文件夹下,路径如“/home/python/.virtualenvs/django_py2/lib/python2.7/site-packages/haystack/backends”

2、文件中编写的内容如下
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()

8、复制whoosh_backend.py文件,新建一个文件改名为whoosh_cn_backend.py
1、

2、
from ChineseAnalyzer import ChineseAnalyzer
查找
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()

9、生成索引
1、
python manage.py rebuild_index

10、在模板中创建搜索栏
1、
<form method=‘get‘ action="/search/" target="_blank">
<input type="text" name="q">
<input type="submit" value="查询">
</form>

-------------------haystack的content回调数据的扩展操作
1、创建一个viewSearch.py文件
# views.py
from datetime import date

from haystack.generic_views import SearchView
from shopping.models import *
from ucenter.models import *

#创建一个类MySearchView继承SearchView
class MySearchView(SearchView):
"""My custom search view."""

def get_context_data(self, *args, **kwargs):
context = super(MySearchView, self).get_context_data(*args, **kwargs)

context[‘username‘] = self.request.session.get(‘username‘, default=‘‘)
sessionUserId = self.request.session.get(‘userId‘, default=‘‘)
cartList = UserInfo.objects.get(pk=sessionUserId).cartinfo_set.all()
cartCount = 0

for cartInfo in cartList:
cartCount += cartInfo.qty
context[‘cartCount‘] = cartCount

print context #查看响应数据的结构

# do something
return context

2、之后配置url
url(r‘^search/‘,MySearchView.as_view()), #include(‘haystack.urls‘)

3、根据相应的数据进行模板页的编写

时间: 2024-12-10 23:23:01

django全文检索的相关文章

Django实现组合搜索的方法示例

目录 一.实现方法 二.基本原理 三.代码样例 方法1:纯模板语言实现 方法二:使用simpletag实现 四.其他变化 1.model定义 2.处理函数变化 3.simpletag相应改变 一.实现方法 1.纯模板语言实现 2.自定义simpletag实现(本质是简化了纯模板语言的判断) 二.基本原理 原理都是通过django路由系统,匹配url筛选条件,将筛选条件作为数据库查询结果,返回给前端. 例如:路由系统中的url格式是这样: ? 1 url(r'^article-(?P<articl

haystack(django的全文检索模块)

haystack haystack是django开源的全文搜索框架 全文检索:标题可以检索,内容也可以检索 支持solr ,elasticsearch,whoosh 1.注册app 在setting.py的app中注册"haystack" 2.指定用哪个引擎(solr,elasticsearch,whoosh) 将配置文件放在setting文件中 在你的`settings.py`中,你需要添加一个设置来指示站点配置文件正在使用的后端,以及其它的后端设置. `HAYSTACK--CONN

python django -6 常用的第三方包或工具

常用的第三方包或工具 富文本编辑器 缓存 全文检索 celery 布署 富文本编辑器 借助富文本编辑器,管理员能够编辑出来一个包含html的页面,从而页面的显示效果,可以由管理员定义,而不用完全依赖于前期开发人员 此处以tinymce为例,其它富文本编辑器的使用可以自行学习 下载安装 在网站pypi网站搜索并下载"django-tinymce-2.4.0" 解压 tar zxvf django-tinymce-2.4.0.tar.gz 进入解压后的目录,工作在虚拟环境,安装 pytho

django之快速分页

本文介绍djanog两种分页,第一是普通分页,第二是使用haystack全文检索的分页. 1.django自带分页功能,这个功能非常好用.基本知识点:Django提供了数据分页的类,这些类被定义在django/core/paginator.py中对象Paginator用于对列进行一页n条数据的分页运算对象Page用于表示第m页的数据Paginator对象 方法init(列表,int):返回分页对象,参数为列表数据,每面数据的条数属性count:返回对象总数属性num_pages:返回页面总数属性

Python全栈开发之Django进阶

No.1 静态文件处理 项目中CSS.JS.图片都属于静态文件,一般会将静态文件存到一个单独目录中,便于管理,在HTML页面调用时,需要指定静态文件的路径,Django提供了一种解析静态文件的机制,文件可以放在项目目录下,也可以放在应用目录下 在mysite/setting.py设置文件的物理路径 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] 在static目录下创建css.js.

Haystack全文检索

1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch(java写的就是用来全文检索的),Whoosh(python写的), **Xapian搜索引擎它是一个可插拔的后端(很像Django的数据库层),所以几乎你所有写的代码都可以在不同搜索引擎之间便捷切换 引擎检索比mysql快很多,安装引擎后以后检索数据不必从mysql中查找,而是直接从引擎中搜索 - 全文检索不

全文检索 部署及使用

全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理 haystack:django的一个包,可以方便地对model里面的内容进行索引.搜索,设计为支持whoosh,solr,Xapian,Elasticsearc四种全文检索引擎后端,属于一种全文检索的框架 whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx.xapian.Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使

全文检索的配置

全文检索不同于特定字段的模糊查询,使用全文检索的效率再高,并且能够对于中文进行分词处理. haystack:全文检索框架,支持whoosh.solr.Xaplan.Elasticsearc四种全文检索引擎 whoosh:纯python编写的全文搜索引擎,虽然 性能比不上sphinx.xapian.elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用, jieba:中文分词包 安装包: pip install django-haystackp

全文检索框架

第一步:安装全文检索框架django-haystack pip3 install django-haystack 第二步:安装搜索引擎 pip3 install whoosh 第三步:在settings配置app INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.mes