更新父和子Solr(5)文档

更新父和子Solr(5)文档,solr,Solr,考虑到我已经为一个父文档以及许多\u childDocuments\uu编制了索引,发布该父文档更新的正确方法是什么?我知道我需要重新提交家长以及任何\u儿童文档 我遇到的问题是,我创建了一个数据库记录,它会触发一个调用来索引该项。(使用Laravel 5) 然后,我关联一些额外的数据,然后启动一个调用来重新索引同一项 它不是用更新版本替换现有的Solr文档,而是将另一个具有相同id的文档添加到索引中id。我注意到不同的\u版本值 在将修订后的文档提交到索引之前,我是否必须删除父文档和任何子文档

考虑到我已经为一个
父文档
以及许多
\u childDocuments\uu
编制了索引,发布该
父文档
更新的正确方法是什么?我知道我需要重新提交
家长
以及任何
\u儿童文档

我遇到的问题是,我创建了一个数据库记录,它会触发一个调用来索引该项。(使用Laravel 5)

然后,我关联一些额外的数据,然后启动一个调用来重新索引同一项

它不是用更新版本替换现有的Solr文档,而是将另一个具有相同id的文档添加到索引中<在
schema.xml
中正确设置了code>id。我注意到不同的
\u版本

在将修订后的文档提交到索引之前,我是否必须删除父文档和任何子文档

注:我运行的版本是
5.3.0-2015-06-16_01-18-34 1685690-jenkins-2015-06-15 21:25:19

以下是schema.xml减去注释:

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
    <field name="_version_" type="long" indexed="true" stored="true"/>

    <field name="_root_" type="string" indexed="true" stored="false"/>

    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

    <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
    <dynamicField name="*_is" type="int"    indexed="true"  stored="true"  multiValued="true"/>
    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
    <dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/>
    <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>
    <dynamicField name="*_ls" type="long"   indexed="true"  stored="true"  multiValued="true"/>
    <dynamicField name="*_t"  type="text_general"    indexed="true"  stored="true"/>
    <dynamicField name="*_txt" type="text_general"   indexed="true"  stored="true" multiValued="true"/>
    <dynamicField name="*_en"  type="text_en"    indexed="true"  stored="true" multiValued="true"/>
    <dynamicField name="*_b"  type="boolean" indexed="true" stored="true"/>
    <dynamicField name="*_bs" type="boolean" indexed="true" stored="true"  multiValued="true"/>
    <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>
    <dynamicField name="*_fs" type="float"  indexed="true"  stored="true"  multiValued="true"/>
    <dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>
    <dynamicField name="*_ds" type="double" indexed="true"  stored="true"  multiValued="true"/>

    <dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false" />

    <dynamicField name="*_dt"  type="date"    indexed="true"  stored="true"/>
    <dynamicField name="*_dts" type="date"    indexed="true"  stored="true" multiValued="true"/>
    <dynamicField name="*_p"  type="location" indexed="true" stored="true"/>

    <dynamicField name="*_ti" type="tint"    indexed="true"  stored="true"/>
    <dynamicField name="*_tl" type="tlong"   indexed="true"  stored="true"/>
    <dynamicField name="*_tf" type="tfloat"  indexed="true"  stored="true"/>
    <dynamicField name="*_td" type="tdouble" indexed="true"  stored="true"/>
    <dynamicField name="*_tdt" type="tdate"  indexed="true"  stored="true"/>

    <dynamicField name="*_c"   type="currency" indexed="true"  stored="true"/>

    <dynamicField name="ignored_*" type="ignored" multiValued="true"/>
    <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>

    <dynamicField name="random_*" type="random" />

    <uniqueKey>id</uniqueKey>

    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />

    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>

    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>

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

    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>

    <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>


    <fieldType name="binary" class="solr.BinaryField"/>

    <fieldType name="random" class="solr.RandomSortField" indexed="true" />

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

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <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.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory"
                    ignoreCase="true"
                    words="lang/stopwords_en.txt"
                    />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <filter class="solr.PorterStemFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.StopFilterFactory"
                    ignoreCase="true"
                    words="lang/stopwords_en.txt"
                    />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <filter class="solr.PorterStemFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.StopFilterFactory"
                    ignoreCase="true"
                    words="lang/stopwords_en.txt"
                    />
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <filter class="solr.PorterStemFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.StopFilterFactory"
                    ignoreCase="true"
                    words="lang/stopwords_en.txt"
                    />
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <filter class="solr.PorterStemFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_en_splitting_tight" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
        <analyzer>
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <filter class="solr.EnglishMinimalStemFilterFactory"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_general_rev" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"
                    maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
        <analyzer>
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.TrimFilterFactory" />
            <filter class="solr.PatternReplaceFilterFactory"
                    pattern="([^a-z])" replacement="" replace="all"
                    />
        </analyzer>
    </fieldType>

    <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
    </fieldType>

    <fieldType name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField" />

    <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>

    <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>

    <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
               geo="true" distErrPct="0.025" maxDistErr="0.001" distanceUnits="kilometers" />

    <fieldType name="bbox" class="solr.BBoxField"
               geo="true" distanceUnits="kilometers" numberType="_bbox_coord" />
    <fieldType name="_bbox_coord" class="solr.TrieDoubleField" precisionStep="8" docValues="true" stored="false"/>

    <fieldType name="currency" class="solr.CurrencyField" precisionStep="8" defaultCurrency="USD" currencyConfig="currency.xml" />


    <fields>
        <field name="amount"             type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="area"               type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="attempted_at"       type="date"         indexed="true"  stored="true" multiValued="false" />
        <field name="attempted_count"    type="int"          indexed="true"  stored="true" multiValued="false" />
        <field name="attempted_how"      type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="attempted_dates"    type="string"       indexed="true"  stored="true" multiValued="true" />
        <field name="block"              type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="body"               type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="building"           type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="city"               type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="community"          type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="condominium"        type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="contacted"          type="boolean"      indexed="true"  stored="true" multiValued="false" />
        <field name="contacted_at"       type="date"         indexed="true"  stored="true" multiValued="false" />
        <field name="contacted_by"       type="string"       indexed="true"  stored="true" multiValued="true" />
        <field name="contacted_how"      type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="contacts"           type="string"       indexed="true"  stored="true" multiValued="true" />
        <field name="continent"          type="string"       indexed="true"  stored="true" multiValued="true" />
        <field name="country"            type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="created_at"         type="date"         indexed="true"  stored="true" multiValued="false" />
        <field name="date_at"            type="date"         indexed="true"  stored="true" multiValued="false" />
        <field name="description"        type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="directions"         type="text_en_splitting"       indexed="true"  stored="true" multiValued="true" />
        <field name="doc_type"           type="string"       indexed="true"  stored="true" required="true"/>
        <field name="feature_age"        type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="feature_color"      type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="feature_feature"    type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="feature_madeof"     type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="floor"              type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="geo_parent_id"      type="long"         indexed="true"  stored="true" multiValued="false" />
        <field name="gmt"                type="int"          indexed="true"  stored="true" multiValued="false" />
        <field name="initials"           type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="json"               type="string"       indexed="false" stored="true" multiValued="false" />
        <field name="key"                type="string"       indexed="false" stored="true" multiValued="false" />
        <field name="lang_id"            type="long"         indexed="true"  stored="true" multiValued="false" />
        <field name="lang_keys"          type="string"       indexed="true"  stored="true" multiValued="true"  />
        <field name="lang_mother_keys"   type="string"       indexed="true"  stored="true" multiValued="true"  />
        <field name="latlon"             type="location"     indexed="true"  stored="true" multiValued="false" />
        <field name="level"              type="int"          indexed="true"  stored="true" multiValued="false" />
        <field name="name"               type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="nameInformal"       type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="neighborhood"       type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="owner_id"           type="long"         indexed="true"  stored="true" multiValued="false" />
        <field name="parent_id"          type="long"         indexed="true"  stored="true" multiValued="false" />
        <field name="par_key"            type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="path"               type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="publish"            type="boolean"      indexed="true"  stored="true" multiValued="false" />
        <field name="publisher_initials" type="boolean"      indexed="true"  stored="true" multiValued="false" />
        <field name="region"             type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="section"            type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="slug"               type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="status"             type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="subject"            type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="terrName"           type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="terrNameInformal"   type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="text"               type="text_general" indexed="true"  stored="true" multiValued="true" />
        <field name="town"               type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="type"               type="string"       indexed="true"  stored="true" multiValued="false" />
        <field name="uid"                type="string"       indexed="false" stored="true" multiValued="false" />
        <field name="updated_at"         type="date"         indexed="true"  stored="true" multiValued="false" />
        <field name="url"                type="string"       indexed="false" stored="true" multiValued="false" />
        <field name="weight"             type="int"          indexed="true"  stored="true" multiValued="false" />
        <field name="zip"                type="string"       indexed="true"  stored="true" multiValued="false" />
    </fields>

    <uniqueKey>id</uniqueKey>

    <defaultSearchField>text</defaultSearchField>


    <copyField source="area" dest="text"/>
    <copyField source="body" dest="text"/>
    <copyField source="building" dest="text"/>
    <copyField source="city" dest="text"/>
    <copyField source="condominium" dest="text"/>
    <copyField source="continent" dest="text"/>
    <copyField source="country" dest="text"/>
    <copyField source="description" dest="text"/>
    <copyField source="directions" dest="text"/>
    <copyField source="feature_age" dest="text"/>
    <copyField source="feature_color" dest="text"/>
    <copyField source="feature_madeof" dest="text"/>
    <copyField source="initials" dest="text"/>
    <copyField source="name" dest="text"/>
    <copyField source="nameInformal" dest="text"/>
    <copyField source="neighborhood" dest="text"/>
    <copyField source="publisher_initials" dest="text"/>
    <copyField source="region" dest="text"/>
    <copyField source="section" dest="text"/>
    <copyField source="slug" dest="text"/>
    <copyField source="subject" dest="text"/>
    <copyField source="terrName" dest="text"/>
    <copyField source="terrNameInformal" dest="text"/>
    <copyField source="town" dest="text"/>
    <copyField source="uid" dest="text"/>
    <copyField source="url" dest="text"/>
    <copyField source="zip" dest="text"/>

</schema>

身份证件
身份证件
文本

如果您共享整个schema.xml就好了。在重新索引之后,您将得到两个文档,或者第二个文档将覆盖第一个文档?我将得到两个具有相同
id
但不同
\u版本
值的文档。第一个只有父文档,然后在更新后,它有更新的父文档以及
\u childDocuments\u
。我想我可能需要将子文档链接到Parent->id,然后在重新提交更新之前删除所有具有该id的文档。谢谢你的输入。所以我同时想到的是,每当我有
\u childDocuments\u
时,我设置一个名为
parent\u doc\u id
的childDoc字段来等于父文档id。然后在我更新/添加文档之前,我运行一个删除查询,比如:
“(id:$id或parent\u doc\u id:$id)”
。这解决了我眼前的问题。我怀疑这是一个薄弱的黑客,比如在比赛条件下。因此,我期待任何输入。如果您共享整个schema,这将是一件好事。xml此后重新索引,您将得到两个文档,或者第二个文档覆盖第一个文档?我将得到两个具有相同
id
但不同
\u版本
值的文档。第一个只有父文档,然后在更新后,它有更新的父文档以及
\u childDocuments\u
。我想我可能需要将子文档链接到Parent->id,然后在重新提交更新之前删除所有具有该id的文档。谢谢你的输入。所以我同时想到的是,每当我有
\u childDocuments\u
时,我设置一个名为
parent\u doc\u id
的childDoc字段来等于父文档id。然后在我更新/添加文档之前,我运行一个删除查询,比如:
“(id:$id或parent\u doc\u id:$id)”
。这解决了我眼前的问题。我怀疑这是一个薄弱的黑客,比如在比赛条件下。因此,我期待任何输入。如果您共享整个schema,这将是一件好事。xml此后重新索引,您将得到两个文档,或者第二个文档覆盖第一个文档?我将得到两个具有相同
id
但不同
\u版本
值的文档。第一个只有父文档,然后在更新后,它有更新的父文档以及
\u childDocuments\u
。我想我可能需要将子文档链接到Parent->id,然后在重新提交更新之前删除所有具有该id的文档。谢谢你的输入。所以我同时想到的是,每当我有
\u childDocuments\u
时,我设置一个名为
parent\u doc\u id
的childDoc字段来等于父文档id。然后在我更新/添加文档之前,我运行一个删除查询,比如:
“(id:$id或parent\u doc\u id:$id)”
。这解决了我眼前的问题。不过我怀疑这是一个像may b这样的弱黑客