zoukankan      html  css  js  c++  java
  • django全文搜索学习心得(二)solr 篇

    本次主要记录如何将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 ,在最后一行会看到

    然后打开浏览器,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 method="get" action=".">
        <table>
            {{ form.as_table }}
            <tr>
                <td>&nbsp;</td>
                <td>
                    <input type="submit" value="Search">
                </td>
            </tr>
        </table>
        {% if query %}
            <h3>结果</h3>
            {{ page.object_list|length }}
            {% for result in page.object_list %}
                <p>
                    <a href="#">{{ result.object.breed }}</a><br/>   
             {% highlight  result.object.breed with query css_class "keyword" %}
    </p> {% empty %} <p>没有结果发现.</p> {% endfor %} {% if page.has_previous or page.has_next %} <div> {% if page.has_previous %}<a href="?q={{ query }}&page={{ page.previous_page_number }}">{% endif %}« Previous{% if page.has_previous %}</a>{% endif %} | {% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}Next »{% if page.has_next %}</a>{% endif %} </div> {% endif %} {% else %} {# Show some example queries to run, maybe query syntax, something else? #} {% endif %} </form>

     索引创建

    首先要确保你的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/  就可以用喽。快试试吧,老兄!

    随缘
  • 相关阅读:
    Python使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/chang/p/2855273.html
Copyright © 2011-2022 走看看