• 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/  就可以用喽。快试试吧,老兄!

    随缘
  • 相关阅读:
    【CANoe基础】CANoe常用操作
    ZedGraph控件横纵坐标显示中文名(转)
    Winforn中设置ZedGraph曲线图的属性、坐标轴属性、刻度属性(转)
    c# 访问sqlite资源
    混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
    ABP框架资源
    vue新建项目一直在downloading template转,最后超时
    vscode(实验)--ABP框架 .net core 版本的安装与运行(vue模板)(转)
    安装-打开-运行-ABP框架(asp.net core 2.X+Vue)运行前端(转)
    VSCode打开Visual Studio的ABP框架项目(转)
  • 原文地址:https://www.cnblogs.com/chang/p/2855273.html
Copyright © 2020-2023  润新知