Search code examples
djangosolrdjango-haystack

Failed to add documents to Solr: [Reason: Error 400 [doc=null] missing required field: site_id]


This has driven me nuts for hours now. I don't know how to proceed. On my local machine, rebuilding the index works fine. On our server as well. On a new server that is setup in the same way as the old server, it fails.

This is the output that I am getting:

Indexing 0 billboard items.
Indexing 0 companys.
Indexing 1 personal profiles.
Failed to add documents to Solr: [Reason: Error 400 [doc=null] missing required field: site_id]
Indexing 0 degrees.
Indexing 0 work experiences.

The error would appear on all models, I cleaned the database and added one PersonalProfile, that is why you see it only for one model here.

None of my models have a site_id field. We are using django-blog-zinnia, which utilizes Django's site framework but we are not adding zinnia to the search at all. Our whole codebase does not contain the word site_id at all, except in the south migration of zinnia.

In my requirements.txt I'm using:

-e git+git://github.com/toastdriven/django-haystack.git@a169ff696ffb739a2ceb0f18c536d5b54c59a235#egg=haystack
pysolr==2.1.0

My search_indexes.py looks like this:

class WorkExperienceIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    user = indexes.CharField()
    job_title = indexes.CharField()
    industry = indexes.CharField(null=True)
    company_name = indexes.CharField(null=True)
    location = indexes.CharField(null=True)
    start_date = indexes.DateField(null=True)
    end_date = indexes.DateField(null=True)
    job_summary = indexes.CharField(null=True)
    technical_skills = indexes.CharField(null=True)
    courses_taken = indexes.CharField(null=True)

    def get_model(self):
        return WorkExperience

    def prepare_user(self, obj):
        return obj.user.email

Under myproject/templates/search_configuration/solr.xml I have this:

<?xml version="1.0" ?>
<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->

<schema name="default" version="1.4">
    <types>
        <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
        <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
        <fieldtype name="binary" class="solr.BinaryField"/>

    <!-- Numeric field types that manipulate the value into
        a string value that isn't human-readable in its internal form,
        but with a lexicographic ordering the same as the numeric ordering,
        so that range queries work correctly. -->
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>

    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>

    <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>
    <!-- A Trie based date field for faster date range queries and date faceting. -->
    <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>

    <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
    <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
    <fieldtype name="geohash" class="solr.GeoHashField"/>

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="5"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <!-- in this example, we will only use synonyms at query time
            <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
            -->
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="5"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="5"/>
            <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords_en.txt"
                enablePositionIncrements="true"
                />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
                <filter class="solr.EnglishMinimalStemFilterFactory"/>
            -->
            <filter class="solr.PorterStemFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="5"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords_en.txt"
                enablePositionIncrements="true"
                />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
                <filter class="solr.EnglishMinimalStemFilterFactory"/>
            -->
            <filter class="solr.PorterStemFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="ngram" class="solr.TextField" >
        <analyzer type="index">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" />
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory" />
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory" />
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
        </analyzer>
    </fieldType>
</types>

    <fields>
        <!-- general -->
        <field name="{{ ID }}" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
        <field name="{{ DJANGO_CT }}" type="string" indexed="true" stored="true" multiValued="false"/>
        <field name="{{ DJANGO_ID }}" type="string" indexed="true" stored="true" multiValued="false"/>

    <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>
    <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>
    <dynamicField name="*_t"  type="text_en"    indexed="true"  stored="true"/>
    <dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>
    <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>
    <dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>
    <dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
    <dynamicField name="*_p" type="location" indexed="true" stored="true"/>
    <dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false"/>

{% for field in fields %}
    <field name="{{ field.field_name }}" type="{{ field.type }}" indexed="{{ field.indexed }}" stored="{{ field.stored }}" multiValued="{{ field.multi_valued }}" />
{% endfor %}
    </fields>

    <!-- field to use to determine and enforce document uniqueness. -->
    <uniqueKey>{{ ID }}</uniqueKey>

    <!-- field for the QueryParser to use when an explicit fieldname is absent -->
    <defaultSearchField>{{ content_field_name }}</defaultSearchField>

    <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
    <solrQueryParser defaultOperator="{{ default_operator }}"/>
</schema>

When I try to rebuild the index, I'm doing this:

supervisorctl stop solr
workon kairos && $HOME/webapps/kairos_django/myproject/manage.py build_solr_schema > $HOME/opt/apache-solr-3.5.0/example/solr/conf/schema.xml
supervisorctl start solr
workon kairos && $HOME/webapps/kairos_django/myproject/manage.py rebuild_index --noinput

This is the generated schema.xml I get from this:

<?xml version="1.0" ?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->

<schema name="default" version="1.4">
    <types>
        <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
        <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
        <fieldtype name="binary" class="solr.BinaryField"/>

    <!-- Numeric field types that manipulate the value into
       a string value that isn't human-readable in its internal form,
       but with a lexicographic ordering the same as the numeric ordering,
       so that range queries work correctly. -->
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>

    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>

    <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>
    <!-- A Trie based date field for faster date range queries and date faceting. -->
    <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>

    <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
    <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
    <fieldtype name="geohash" class="solr.GeoHashField"/>

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="5"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <!-- in this example, we will only use synonyms at query time
           <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
           -->
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="5"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="5"/>
            <filter class="solr.StopFilterFactory"
               ignoreCase="true"
               words="stopwords_en.txt"
               enablePositionIncrements="true"
               />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
               <filter class="solr.EnglishMinimalStemFilterFactory"/>
           -->
            <filter class="solr.PorterStemFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="5"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.StopFilterFactory"
               ignoreCase="true"
               words="stopwords_en.txt"
               enablePositionIncrements="true"
               />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
               <filter class="solr.EnglishMinimalStemFilterFactory"/>
           -->
            <filter class="solr.PorterStemFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="ngram" class="solr.TextField" >
        <analyzer type="index">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" />
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory" />
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory" />
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
        </analyzer>
    </fieldType>
</types>

    <fields>
        <!-- general -->
        <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
        <field name="django_ct" type="string" indexed="true" stored="true" multiValued="false"/>
        <field name="django_id" type="string" indexed="true" stored="true" multiValued="false"/>

    <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>
    <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>
    <dynamicField name="*_t"  type="text_en"    indexed="true"  stored="true"/>
    <dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>
    <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>
    <dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>
    <dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
    <dynamicField name="*_p" type="location" indexed="true" stored="true"/>
    <dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false"/>


    <field name="type" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="description" type="date" indexed="true" stored="true" multiValued="false" />

    <field name="title" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="text" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="is_completed" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="place_of_work" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="personal_characteristics" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="responsibilities" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="work_experience" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="educational_level" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="owner" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="is_verified" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="amount_of_vacancies" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="annual_turnover" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="local_shareholding" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="number_of_employees" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="collaboration" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="user" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="name" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="end_date" type="date" indexed="true" stored="true" multiValued="false" />

    <field name="field_of_study" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="degree_awarded" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="awarding_institution" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="location" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="technical_skills" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="start_date" type="date" indexed="true" stored="true" multiValued="false" />

    <field name="email_personal" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="first_name" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="last_name" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="phone_work" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="skills" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="email_work" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="address_home" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="address_office" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="self_description" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="date_of_birth" type="date" indexed="true" stored="true" multiValued="false" />

    <field name="country_of_birth" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="phone_personal" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="nationality" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="collaboration_projects" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="cv" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="industry" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="job_summary" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="company_name" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="courses_taken" type="text_en" indexed="true" stored="true" multiValued="false" />

    <field name="job_title" type="text_en" indexed="true" stored="true" multiValued="false" />

    </fields>

    <!-- field to use to determine and enforce document uniqueness. -->
    <uniqueKey>id</uniqueKey>

    <!-- field for the QueryParser to use when an explicit fieldname is absent -->
    <defaultSearchField>text</defaultSearchField>

    <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
    <solrQueryParser defaultOperator="AND"/>
</schema>

Any help will be greatly appreciated!


Solution

  • Kudos goes to Alexandre Rafalovitch who's comment pointed me into the right direction.

    It turns out that supervisor starts and stops solr without reporting any errors. When I started solr manually, I would see that it cannot be started because the port was taken.

    That means, unknowingly I left out the most important information: I was working on a shared hosting environment, where another user had already setup his own solr instance.

    In order to further verify that I made sure that supervisor and "my" solr instance were stopped. Then I ran

    curl http://localhost:8983/solr
    

    And I got a response.

    Now things were easy. I changed the port in

    ~/opt/apache-solr-3.5.0/example/etc/jetty.xml
    

    to 8984 and in the local_settings.py of my Django project I added the following:

    HAYSTACK_CONNECTIONS = {
        'default': {
            'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
            'URL': 'http://127.0.0.1:8984/solr'
        },
    }
    

    Et voila. Now I can rebuild my index again.