设为首页 收藏本站
查看: 1279|回复: 0

[经验分享] Django haystack+solr搜索引擎部署的坑.

[复制链接]

尚未签到

发表于 2017-12-19 12:30:49 | 显示全部楼层 |阅读模式
  跟着<<Django by Example>> 一路做下来,到了搭建搜索引擎的步骤
  默认的思路是用
  obj.objects.filter(body__icontains='framework')
  然后把得到的QuerySet 返回到模板中使用
  首先要确保你的java版本在 1.7或之上
  使用 java -version 查看
  http://archive.apache.org/dist/lucene/solr/ 然后到这个网站里下载 Solr 这里我使用的是4.10.4(不同版本之间的差异有点不一样,慎重选择.不然会被坑死)
  然后进入example文件夹
  

java -jar start.jar //服务运行Solr;  

  

  打开你的浏览器,进入URL:http://127.0.0.1:8983/solr/  你会看到类似这种界面
   DSC0000.png
  我们要为我们的应用创建一个core ,首先要创建目录树
  

  

  blog$ tree
  .
  ├── conf
  │   ├── core.properties
  │   ├── lang
  │   │   └── stopwords_en.txt
  │   ├── protwords.txt
  │   ├── _rest_managed.json
  │   ├── schema.xml
  │   ├── solrconfig.xml
  │   ├── stopwords.txt
  │   └── synonyms.txt
  └── data
  └── index
  ├── segments_1
  ├── segments.gen
  

  

  在solrconfig.xml文件中添加如下XML代码:
  

?xml version="1.0" encoding="utf-8" ?>  
<config>
  <luceneMatchVersion>LUCENE_36</luceneMatchVersion>
  <requestHandler name="/select" default="true" />
  <requestHandler name="/update" />
  <requestHandler name="/admin" />
  <requestHandler name="/admin/ping">
  <lst name="invariants">
  <str name="qt">search</str>
  <str name="q">*:*</str>
  </lst>
  </requestHandler>
  
</config>
  

  这是一个最小的Solr配置。编辑schema.xml文件,加入如下XML代码:
  

<?xml version="1.0" ?>  
<schema name="default" version="1.5">
  
</schema>
  

  然后我们创建一个自己的架构
DSC0001.png



  • name: blog
  • instanceDir: blog
  • dataDir: data
  • config: solrconfig.xml
  • schema: schema.xml
  name字段是你想给这个core起的名字。instanceDir字段是你的core的目录。dataDir是索引数据将要存放的目录,它位于instanceDir目录下面。config字段是你的Solr XML配置文件名。schema字段是你的Solr XML 数据架构(schema)文件名。
  为了在Django中使用Solr,我们还需要Haystack。使用下面的命令,通过pip渠道安装Haystack:
  
这里我们直接安装最新版的,书上有指定版本.跟着做坑了我一个早上,幸好各种google下来解决了问题,在此记录下,希望后面踩到坑的人也能顺利渡劫.不过最好下之前看看自己的django版本haystack支持不支持...
附上github项目地址
https://github.com/django-haystack/django-haystack/issues
  

pip isntall django-haystack  

  
//Haystack能和一些搜索引擎后台交互。要使用Solr后端,你还需要安装pysolr模块。运行如下命令安装它:
  

  

  
pip install pysolr
  

  
然后在setting 中添加它
  
INSTALLED_APPS = (
  # ...
  haystack',
  
)
  

  
再添加搜索引擎后端
  
HAYSTACK_CONNECTIONS = {
  'default': {
  'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
  'URL': 'http://127.0.0.1:8983/solr/blog'
  },
  
}
  

  

  在,我们必须将我们想要存储在搜索引擎中的模型进行注册。Haystack的惯例是在你的应用中创建一个search_indexes.py文件,然后在该文件中注册你的模型(models)。在你的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模型(model)的自定义SearchIndex。通过这个索引(index),我们告诉Haystack这个模型(model)中的哪些数据必须被搜索引擎编入索引。这个索引(index)是通过继承indexes.SearchIndexindexes.Indexable构建的。每一个SearchIndex都需要它的其中一个字段拥有document=True。按照惯例,这个字段命名为text。这个字段是一个主要的搜索字段。通过使用use_template=True,我们告诉Haystack这个字段将会被渲染成一个数据模板(template)来构建document,它会被搜索引擎编入索引(index)。publish字段是一个日期字段也会被编入索引。我们通过model_attr参数来表明这个字段对应Post模型(model)的publish字段。这个字段将用 被索引的Post对象的publish字段的内容 索引。
  额外的字段,像这个为搜索提供额外的过滤器(filters),是非常有用的。get_model()方法必须返回将储存在这个索引中的documents的模型(model)。index_queryset()方法返回将会被编入索引的对象的查询集(QuerySet)。请注意,我们只包含了发布状态的帖子。
  

现在,在blog应用的模板(templates)目录下创建目录和文件search/indexes/blog/post_text.txt,然后添加如下代码:  

  
{{ object.title }}
  
{{ object.tags.all|join:", " }}
  
{{ object.body }}
  

  

  现在,我们已经有了一个自定义的搜索索引(index),我们需要创建合适的Solr架构(schema)。Solr的配置基于XML,所以我们必须为我们即将索引(index)的数据生成一个XML架构(schema)。非常幸运,haystack提供了一个基于我们的搜索索引(indexes),动态生成架构(schema)的方法。打开终端,运行以下命令:
  python manage.py build_solr_schema
   DSC0002.png
  如果你看到的是这样的,那么恭喜你配置成功...
  如果不是这样的,请去官网看看支持的版本和看看自己的版本对应不对应了...
  在你的浏览器中打开 http://127.0.0.1:8983/solr/ 然后点击Core Admin菜单栏,再点击blog core,然后再点击Reload按钮:
  

索引数据(Indexing data)  

  
让我们blog中的帖子编辑索引(index)到Solr中。打开终端,执行以下命令:
  

  
python manage.py rebuild_index
  

  

  y下一步
  在浏览器中打开 http://127.0.0.1:8983/solr/#/blog 。在*Statistics下方,你会看到被编入索引(indexed)documents的数量,如下所示:
DSC0003.png

  现在,在浏览器中打开 http://127.0.0.1:8983/solr/#/blog/query 。这是一个Solr提供的查询接口。点击Execute query按钮。默认的查询会请求你的core中所有被编入索引(indexde)的documents。你会看到一串带有这个查询结果的JSON输出。输出的documents如下所示:
  

{  "id": "blog.post.1",
  "text": "Who was Django Reinhardt?\njazz, music\nThe Django web framework was named after the amazing jazz guitarist Django Reinhardt.",
  "django_id": "1",
  "publish": "2015-09-20T12:49:52Z",
  "django_ct": "blog.post"
  
},
  

  这是每个帖子在搜索索引(index)中存储的数据。text字段包含了标题,通过逗号分隔的标签(tags),还有帖子的内容,这个字段是在我们之前定义的模板(template)上构建的。
  你已经使用过python manage.py rebuild_index来删除索引(index)中的所有信息然后再次对documents进行索引(index)。为了不删除所有对象而更新你的索引(index),你可以使用python manage.py update_index。另外,你可以使用参数--age=<num_hours>来更新少量的对象。为了保证你的Solr索引更新,你可以为这个操作设置一个定时任务(Cron job)
  

创建一个搜索视图(view)  

  
现在,我们要开始创建一个自定义视图(view)来允许我们的用户搜索帖子。首先,我们需要一个搜索表单(form)。编辑blog应用下的forms.py文件,加入以下表单:
  

  
class SearchForm(forms.Form):
  query = forms.CharField()
  

  

  我们会使用query字段来让用户引入搜索条件(terms)。编辑blog应用下的views.py文件,加入以下代码:
  

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()
  # return HttpResponse(results.count())
  # count total results
  total_results = results.count()
  

  

  return render(request,'blog/post/search.html',
  {'form':form,
  'cd':cd,
  'results':results,
  'total_results':total_results})
  

  return render(request,'blog/post/search.html',{'form':form})
  

  

  

搜索视图(view)已经准备好了。我们还需要创建一个模板(template)来展示表单(form)和用户执行搜索后返回的结果。在templates/blog/post/目录下创建一个新的文件命名为search.html,添加如下代码:  

  
{% extends "blog/base.html" %}
  
{% block>  
{% block content %}
  {% if "query" in request.GET %}
  <h1>Posts containing "{{ cd.query }}"</h1>
  <h3>Found {{ total_results }} result{{ total_results|pluralize }}</h3>
  {% for result in results %}
  {% with post=result.object %}
  <h4><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4>           
  {{ post.body|truncatewords:5 }}
  {% endwith %}
  {% empty %}
  <p>There are no results for your query.</p>
  {% endfor %}   
  <p><a href="{% url "blog:post_search" %}">Search again</a></p>
  {% else %}
  <h1>Search for posts</h1>
  <form action="." method="get">
  {{ form.as_p }}
  <input type="submit" value="Search">
  </form>
  {% endif %}
  
{% endblock %}
  

  

  添加视图
  

url(r'^search/$', views.post_search, name='post_search'),  

  

  现在,在浏览器中打开 http://127.0.0.1:8000/blog/search/。你会看到如下图所示的搜索表单(form):

DSC0004.jpg
  


输入搜索就是这种效果了
DSC0005.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-425692-1-1.html 上篇帖子: nutch和solr建立搜索引擎基础(单机版) 下篇帖子: Tomcat、TongWeb5.0、TongWeb6.0部署solr
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表