为博客添加全文搜索引擎
Solr:开源的搜索引擎平台,提供全文检索,高亮显示等
Haystack:django为搜索引擎提供得抽象API
首先需要java1.7以上支持
下载安装java RE 检查java -version
http://www.oracle.com/technetwork/java/javase/downloads/index.html
下载Solr 4.10.4
http://archive.apache.org/dist/lucene/solr/
进入 solr-4.10.4/example/目录
运行
java -jar start.jar 打开Jetty web server服务器
打开地址:http://127.0.0.1:8983/solr/ 显示如下:
为blog应用创建核心--即一个搜索引擎
首先创建一个核心的文件结构
在solr-4.10.4/example/solr目录下创建blog目录和底下的文件结构
复制底下的xml内容到solrconfig.xml,这是最小的配置
LUCENE_36 search *:*
编辑schema.xml文件,添加下面代码
注:这是一个空的schema,这个主要用来定义被搜索引擎索引的域和类型
后面会覆盖它
回到web 添加核心
安装Haystack
pip install django-haystack
安装solr搜索引擎后端
pip install pysolr==3.3.2
在setting文件中添加 haystack 应用
定义haystack的后端搜索引擎
HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.solr_backend.SolrEngine', 'URL': 'http://127.0.0.1:8983/solr/blog' }, }
创建索引
在blog应用下创建 search_indexes.py
from haystack import indexes from .models import Post class PostIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) publish = indexes.DateTimeField(model_attr='publish') def get_model(self): return Post def index_queryset(self, using=None): return self.get_model().published.all()
这里定义了哪些域将会被索引(已经出版的post对象和出版时间)
在blog应用的模板目录下创建下面路径的文件
search/indexes/blog/post_text.txt
添加如下代码
` object`.`title `
{{ object.tags.all|join:", " }}
` object`.`body `
这是我们索引text域的默认路径
生成schema
python manage.py build_solr_schema
将输出的xml内容复制到schema.xml文件中
打开web 点击Reload重新加载shcema
重建索引数据
python manage.py rebuild_index
打开web: http://127.0.0.1:8983/solr/#/blog
显示如下信息:
你可以看到上面显示索引文档的数量
打开http://127.0.0.1:8983/solr/#/blog/query
这是solr 提供查询接口 点击执行查询能够看到json格式的结果
可以看到每个字典就是一个post对象, 而且text的格式也是之前定义好的
注: python manage.py rebuild_index 会移除之前的索引
python manage.py update_index 不会移除之前的索引
你可以设置一个定时任务 自动更新索引
创建一个搜索视图
添加一个搜索的Form
class SearchForm(forms.Form):
query = forms.CharField()
添加视图post_search
def post_search(request): form = SearchForm() if 'query' in request.GET: form = SearchForm(request.GET) if form.is_valid(): cd = form.cleaned_data results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all() # count total results total_results = results.count() else: cd = {} results = [] total_results = [] return render(request, 'blog/post/search.html', {'form': form, 'cd': cd, 'results': results, 'total_results': total_results})
为视图创建模板
在blog应用模板目录下新建 search.html
{% extends "blog/base.html" %} {% block title %}Search{% endblock %} {% block content %} {% if "query" in request.GET %}{% endif %} {% endblock %}Posts containing "{{ cd.query }}"
Found {{ total_results }} result{{ total_results|pluralize}}
{% for result in results %} {% with post=result.object %}{{ post.title }}
{{ post.body|truncatewords:5 }} {% endwith %} {% empty %}There are no results for your query.
{% endfor %} {% else %}Search for posts
为视图添加url
url(r'^search/$', views.post_search, name='post_search'),
现在打开浏览器
http://127.0.0.1:8000/blog/search/
你应该看到如下
执行查询结果如下:
至此,整个blog应用结束,欢迎大家提出意见,一起学习!