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

[经验分享] django全文搜索学习心得(二)solr 篇

[复制链接]

尚未签到

发表于 2015-7-17 10:02:57 | 显示全部楼层 |阅读模式
  本次主要记录如何将solr与haystack结合使用。
  安装
  haystack的安装见上一篇
  solr:
  到官方网站下载3.6版本 http://lucene.apache.org/solr/ ,下载完成解压到D盘更名文件夹名字为solr(不是必须,只是为了简便)。
  在cmd窗口下
  cd D:\solr\example
  java -jar start.jar 运行,在提示窗口中,仔细看会有错误,说没有stopwords_en.txt 。(当然如果提示不能运行java的,请自行安装java啊)
  这里我的做法是复制  d:\solr\example\solr\conf 下的stopwords.txt ,然后重命名为stopwords_en.txt
  再次运行 java -jar start.jar ,在最后一行会看到
DSC0000.jpg
  然后打开浏览器,http://localhost:8983/solr/  会看到solr已经运行啦。
  
  django的配置
  settings.py 文件的配置,设置haystack 搜索引擎



HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
'URL': 'http://127.0.0.1:8983/solr/',
'INCLUDE_SPELLING': True,
},
}
  开始使用:
  python manage.py startapp solrtest ( 相信创建工程及配置数据库,大家都应该会吧,我就不做介绍了,直接app了 )
  我这里使用从haystack 2.0 zip文件包中包含的例子 解压目录\django-haystack-master\example_project\regular_app
  然后复制model内容到 solrtest的model 中 ,这里边有 dog 哦,小心………… ,内容如下



import datetime
from django.db import models

BREED_CHOICES = [
('collie', 'Collie'),
('labrador', 'Labrador'),
('pembroke', 'Pembroke Corgi'),
('shetland', 'Shetland Sheepdog'),
('border', 'Border Collie'),
]

class Dog(models.Model):
breed = models.CharField(max_length=255, choices=BREED_CHOICES)
name = models.CharField(max_length=255)
owner_last_name = models.CharField(max_length=255, blank=True)
birth_date = models.DateField(default=datetime.date.today)
bio = models.TextField(blank=True)
public = models.BooleanField(default=True)
created = models.DateTimeField(default=datetime.datetime.now)
updated = models.DateTimeField(default=datetime.datetime.now)
def __unicode__(self):
return self.full_name()
@models.permalink
def get_absolute_url(self):
return ('dog_detail', [], {'id': self.id})
def title(self):
return u'%s' % (self.breed)
def full_name(self):
if self.owner_last_name:
return u"%s %s" % (self.name, self.owner_last_name)
return self.name

class Toy(models.Model):
dog = models.ForeignKey(Dog, related_name='toys')
name = models.CharField(max_length=60)
def __unicode__(self):
return u"%s's %s" % (self.dog.name, self.name)
  然后,将 search_indexes.py 复制到solrapp目录下,本来应该自己创建的,有咱就直接复制啦,内容如下



from haystack import indexes
from models import Dog

class DogIndex(indexes.RealTimeSearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)   # 此处use_template=True , 我们需要添加一个模板文件,要看下边介绍啊
    title = indexes.CharField(model_attr='breed')
name = indexes.CharField(model_attr='full_name')
bio = indexes.CharField(model_attr='name')
birth_date = indexes.DateField(model_attr='birth_date')
    toys = indexes.MultiValueField()
def get_model(self):
return Dog
def index_queryset(self):
return self.get_model().objects.filter(public=True)
def prepare_toys(self, obj):
return [toy.id for toy in obj.toys.all()]

   模板创建
  模板创建有两个地方:第一个是,索引数据模板 ,创建文件 templates\search\indexes\solrapp\dog_text.txt  ,注意文件名格式固定,应该是(model名_text.txt)     内容(也可复制)



{{ object.full_name }}            这里都要写上能从model中获得的属性名字
{{ object.breed }}
{{ object.bio }}
{% for toy in object.toys.all %}
{{ toy.name }}
{% endfor %}
  第二个模板就是我们的搜索页面了,创建文件 templates\search\search.html  ,如果你查看源文件的话,应该会发现这个是默认位置, 内容:



{% load highlight %}


{{ form.as_table }}

 





{% if query %}
结果
{{ page.object_list|length }}
{% for result in page.object_list %}

{{ result.object.breed }}   
         {% highlight  result.object.breed with query css_class "keyword" %}
            
{% empty %}
没有结果发现.
{% endfor %}
{% if page.has_previous or page.has_next %}

{% if page.has_previous %}{% endif %}« Previous{% if page.has_previous %}{% endif %}
|
{% if page.has_next %}{% endif %}Next »{% if page.has_next %}{% endif %}

{% endif %}
{% else %}
{# Show some example queries to run, maybe query syntax, something else? #}
{% endif %}

  索引创建
  首先要确保你的solr能够运行,然后按照  pysolr   (pip install pysolr ),注意版本一定要是2.0.9+ 的,pip现在是 2.1.0版本.
  低版本可能会有的错误:

Getting AttributeError: 'NoneType' object has no attribute 'lower' in some movies



cd  d:\solr\example\
java -jar start.jar
  因为是solr,根据haystack官方文档,要先创建一个模式文件 schema.xml ,创建方法也很简单



python manage.py build_solr_schema
  执行之后会在网站project根目录下生成一个 schema.xml 文件 ,你需要将此文件复制到 solr目录中 D:\solr\example\solr\conf(通常这里会已经存在了,覆盖即可,我看基本一样)



python manage.py rebuild_index
  成功创建索引,如果有错误,请仔细查看问题,也可博客留言,反正我在尝试过程中遇到不少错误(你遇到的我可能已经解决了哦)
  先列一个吧
     Failed to add documents to Solr: [Reason: None]

     解决办法:查看solr是否正常运行,重新创建索引
     另外附上一个haystack错误官方解释
  到此基本工作都以完成,运行project



python manage.py runserver
  打开 http://127.0.0.1:8000/search/  就可以用喽。快试试吧,老兄!
  
  
  

运维网声明 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-87555-1-1.html 上篇帖子: Solr Configuration Best Practices and Troubleshooting Tips 下篇帖子: 开源搜索引擎Solr的快速搭建及集成到企业门户最佳实施方案--转载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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