Solr:在数据导入期间转换逗号分隔的字段

时间:2012-02-25 17:19:24

标签: solr

我正在使用Solr 3.5.0。我从JDBC数据源导入并有一个分隔字段,我想分成单个值。我正在使用RegexTransformer但我的字段没有被拆分。

样本值

Bob,Carol,Ted,Alice

数据-config.xml中

<dataConfig>
  <dataSource driver="..." />
  <document>
    <entity name="ent"
            query="SELECT id,names FROM blah"
            transformer="RegexTransformer">
      <field column="id" />
      <field column="names" splitBy="," />
    </entity>
  </document>
</dataConfig>

schema.xml中

<schema name="mytest" version="1.0">
  <types>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true"
               omitNorms="true"/>
    <fieldType name="integer" class="solr.IntField" omitNorms="true"/>
  </types>
  <fields>
    <field name="id" type="integer" indexed="false" stored="true"
           multiValued="false" required="true" />
    <field name="name" type="string" indexed="true" stored="true"
           multiValued="true" required="true" />
  </fields>
</schema>

当我搜索时,我得到一个结果doc元素:

<doc>
  <int name="id">22</int>
  <arr name="names">
    <str>Bob,Carol,Ted,Alice</str>
  </arr>
</doc>

我希望得到这个:

<doc>
  <int name="id">22</int>
  <arr name="names">
    <str>Bob</str>
    <str>Carol</str>
    <str>Ted</str>
    <str>Alice</str>
  </arr>
</doc>

我很可能误解了维基的RegexTransformer部分。我已经尝试更改我的分隔符,我尝试使用不同的字段表示部件(如wiki中所示)...

<field column="name" splitBy="," sourceColName="names" />

...但这导致了一个空的name字段。我做错了什么?

5 个答案:

答案 0 :(得分:14)

我通过在架构文件中创建字段类型来处理类似的问题:

<fieldType name="commaDelimited" class="solr.TextField">
      <analyzer>
        <tokenizer class="solr.PatternTokenizerFactory" pattern=",\s*" />
      </analyzer>
</fieldType>

然后我将该类型应用于数据字段的字段,如:

<field name="features" type="commaDelimited" indexed="true" stored="true"/>

答案 1 :(得分:2)

您的数据库列名为names,而Solr字段名为name(注意缺少的s)。一种解决方案是在DIH配置中使用以下内容,然后重新编制索引。

<field name="name" column="names" splitBy=","/>

答案 2 :(得分:1)

尝试在查询语句之前放置transformer =“RegexTransformer”,但也有错误

   transformer="RegexTransformer">

您需要删除'&gt;'

答案 3 :(得分:1)

您可以使用transformer =“RegexTransformer”,也可以使用javascript分割值。

<script><![CDATA[

function stringtoarray(row) {
 var value=row.get('names');

 if(value !="" && value !=null) {   
   name_arr=value.split(",");
   row.put('name',name_arr);
   return row;
 }
}
]]>
</script>

并将transformer="script:stringtoarray"添加到实体字段

答案 4 :(得分:0)

如果您的字段中有多个值,例如-

actors“:[[” Chris Pratt,Vin Diesel,Bradley Cooper和Zoe Saldana“],您可以在schema.xml中以as-

的形式创建新的字段类型。
<fieldType name="search_field_type" class="solr.TextField" positionIncrementGap="100" multiValued="true">
      <analyzer type="index">
        <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*,\s*" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
  </fieldType>
  <field name="actors" type="search_field_type" uninvertible="false" indexed="true" required="true" stored="true"/>

数据配置

<dataConfig>
<dataSource  type="JdbcDataSource" driver="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/movie" user="postgres" password="postgres" />
    <document >
      <entity name="moviedata"  pk="rank" query="SELECT * from moviedata" transformer="RegexTransformer">
        <field column="actors"  splitBy="," name="actors"/>
      </entity>
    </document>
</dataConfig>

导入数据后,您的字段将为-

“演员”:[“克里斯·普拉特”,“文·迪塞尔”,“布拉德利·库珀”,“佐伊·索尔达娜”]