我正在使用Solr 3.5.0。我从JDBC数据源导入并有一个分隔字段,我想分成单个值。我正在使用RegexTransformer
但我的字段没有被拆分。
Bob,Carol,Ted,Alice
<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 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
字段。我做错了什么?
答案 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>
导入数据后,您的字段将为-
“演员”:[“克里斯·普拉特”,“文·迪塞尔”,“布拉德利·库珀”,“佐伊·索尔达娜”]