使用Django haystack集成solr编写搜索引擎(一)

1.环境配置
这一点很重要!请一定看仔细了!就是由于版本的不匹配,导致本博花了一天的时间在debug上,虽然solr 5.0.0的版本界面好看,然而不兼容haystack,这一点在踩过坑的人debug时得到了验证,haystack源码中solr_backend中有这么一段注释:
这里写图片描述
之后本博尝试去修改框架中的代码,力图让其能够和solr 5 兼容,但实在能力有限,无法读懂haystack里面得弯弯绕绕,不得不暂时向作者势力低头,乖乖回退了版本。

环境版本及下载地址:
solr:3.6.1
http://archive.apache.org/dist/lucene/solr/3.6.1/
haystack:2.6.0
https://github.com/django-haystack/django-haystack/tree/v2.6.0
Django:1.8 (可直接使用pip,指定版本)
pysolr:3.6.0 (可直接使用pip,指定版本)

操作系统:Window7 64位
IDE:Pycharm
数据库:Mysql

2.配置流程
①启动solr
这里写图片描述

使用cmd命令,目录到example里 java -jar start.jar,然后进入solr界面http://localhost:8983/solr/admin/ 如下:
这里写图片描述

②在pycharm中新建一个Django project,然后在其setting中增加以下配置
目录如下,其中book是我的app name
这里写图片描述

#添加Haystack 到 INSTALLED_APPS
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'haystack',
    'your app name'  
)
#配置solr引擎
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
        'URL': 'http://127.0.0.1:8983/solr/'
},
}
#数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'your db name',
        'USER':'your user name',
        'PASSWORD':'your passwor',
        'HOST':'',
        'PORT':'',
    }
}

③新建models
在本文中数据库比较简单,只包含3个字段,如下:
这里写图片描述

class Book(models.Model):
    name = models.CharField(max_length=140)   #这里一定要指定长度
    author = models.CharField(max_length=140)

在Django里建立了model之后就可以自动生成表勒,命令如下:

# 进入 manage.py 所在的那个文件夹下输入这个命令
python manage.py syncdb 

#注意:Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate

④在book目录下新建search_indexes.py

class BookIndex(indexes.SearchIndex, indexes.Indexable):  #类名必须为需要检索的Model_name+Index,这里需要检索book,所以创建bookIndex
    text = indexes.CharField(document=True, use_template=True)
    name = indexes.CharField(model_attr='name')
    author = indexes.CharField(model_attr='author')

    def get_model(self):  #重载get_model方法
        return Book

    def index_queryset(self,using=None):  #using不能漏写了
        return self.get_model().objects.all()

⑤新建templates/search/indexes/book/book_text.txt:

<!-- lang: html -->
</h2>{
    
    { object.name }}</h2>
<p>{
    
    { object.author }}</p>

⑥在urls.py中加入

    url(r'^admin/', include(admin.site.urls)),
    url(r'^search/', include('haystack.urls')),
    url(r'^$', include('haystack.urls')),

⑦新建templates/search/search.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>Search</h2>

<form method="get" action=".">
    <table>
        {
    
    { form.as_table }}
        <tr>
            <td>&nbsp;</td>
            <td>
                <input type="submit" value="Search">
            </td>
        </tr>
    </table>

    {% if query %}
        <h3>Results</h3>

        {% for result in page.object_list %}
            <p>
                Name: {
    
    { result.object.name }}
            </p>
            <p>
                Author: {
    
    { result.object.author }}
            </p>
        {% empty %}
            <p>No results found.</p>
        {% endfor %}

        {% if page.has_previous or page.has_next %}
            <div>
                {% if page.has_previous %}<a href="?q={
    
    { query }}&amp;page={
    
    { page.previous_page_number }}">{% endif %}&laquo; Previous{% if page.has_previous %}</a>{% endif %}
                |
                {% if page.has_next %}<a href="?q={
    
    { query }}&amp;page={
    
    { page.next_page_number }}">{% endif %}Next &raquo;{% if page.has_next %}</a>{% endif %}
            </div>
        {% endif %}
    {% else %}
        {# Show some example queries to run, maybe query syntax, something else? #}
    {% endif %}
</form>
</body>
</html>

⑧生成schema,然后将其覆盖your path/solr-3.6.1/example/solr/conf/schema.xml

python manage.py build_solr_schema 

⑨重建索引文件

python manage.py rebuild_index

3.结果展示
这里写图片描述

历经千辛万苦啊!撒花!其中踩坑无数,终于弄好了!转载请注明出处!下一篇打算加入中文分词以及界面美化。

参考资料:
http://www.ziqiangxuetang.com/django/django-models.html
http://www.2cto.com/kf/201610/557680.html
https://my.oschina.net/zhuf/blog/95491

猜你喜欢

转载自blog.csdn.net/sinat_33455447/article/details/59109075