部分架构共享 - 是否可能?

时间:2014-04-29 12:18:00

标签: solr

我们有大量的Solr核心,它们共享相同的字段,但对于某些字段类型(例如,对于不同的语言)具有不同的定义。

例如,在以下示例中,我有一个full_text字段text,它存在于两个不同的核心中,但我对每个核心中的text字段应用了不同的过滤器。

核心1

<fields>
    <field name="full_text" type="text" indexed="true" />
</fields>
<types>
    <fieldType name="text" class="solr.TextField">
         <analyzer type="index">
             <tokenizer class="solr.StandardTokenizerFactory" />
             <filter class="solr.SnowballPorterFilterFactory" language="English"/>
         </analyzer>
    </fieldType>
</types>

核心2

<fields>
    <field name="full_text" type="text" indexed="true" />
</fields>
<types>
    <fieldType name="text" class="solr.TextField">
         <analyzer type="index">
             <tokenizer class="solr.StandardTokenizerFactory" />
             <filter class="solr.SnowballPorterFilterFactory" language="Portuguese"/>
         </analyzer>
    </fieldType>
</types>

由于我们有20多个核心,因此难以维护和更新字段集。

有没有办法从某些父级继承字段并覆盖(或应用某种转换)字段类型定义?到目前为止,我的搜索结果都没有发现。

1 个答案:

答案 0 :(得分:1)

1。提取公共字段类型

您可以使用XInclude来解决此问题。您需要将字段类型写入自己的XML文件,然后将该文件包含在这几个schema.xml文件中。

Paige Cook已经回答了类似的问题How to include another XML file from within a Solr schema.xml?

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="foo" version="1.5">
  <fields>
    <field name="full_text" type="text" indexed="true" />
  </fields>
  <xi:include href="/path/to/field_types.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
</schema>

然后在您的新field_types.xml中,您将拥有类型定义

<types>
    <fieldType name="text" class="solr.TextField">
         <analyzer type="index">
             <tokenizer class="solr.StandardTokenizerFactory" />
             <filter class="solr.SnowballPorterFilterFactory" language="Portuguese"/>
         </analyzer>
    </fieldType>
</types>

您将需要Solr 4.X或5.X,因为已使用SOLR-3087修复此问题。

2。使用core.properties定义变量部分

正如您可以在样本中看到的那样,每个核心似乎都有一个专为其设计的语言。您可以将此语言放入core.properties.这是属于每个核心的属性文件,当遵循Solr 4.4中引入的the new core configuration approach时。

在该core.properties中,您可以引入新属性,例如一个名为typeLanguage

的属性
name=core-1
loadOnStartup=false
typeLanguage=English

然后,此属性可以使用${ xxx }表示法在先前定义的字段类型中用作参数,例如language="${typeLanguage}"

<fieldType name="text" class="solr.TextField">
     <analyzer type="index">
         <tokenizer class="solr.StandardTokenizerFactory" />
         <filter class="solr.SnowballPorterFilterFactory" language="${typeLanguage}" />
     </analyzer>
</fieldType>