我们正在为Java SolrJ使用solr embeded实例。
我想在文档中添加多值字段。多值字段是逗号分隔的字符串。
在Java中我想做:
solrInputDocument.addField(Field1, "value1,value2,value3");
架构中Field1的定义如下
<field name="Field1" type="multiValuedField" indexed="true" stored="true" multiValued="true" required="false"/>
<fieldType name="multiValuedField" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.ClassicTokenizerFactory"/>
</analyzer>
</fieldType>
使用这种配置,我们期望当我们调用addField方法时,Solr能够检查它是否为multiValuedField,因此它将String转换为具有不同值的arrayList。
相反,我们只得到一个只有一个值的arraylist,实际上是添加到文档中的原始字符串。
问题:应该是标记器处理这个问题,还是应该在我们向文档中添加多值字段时自行完成?
感谢。
答案 0 :(得分:11)
SolrInputDocument的addField方法接受字符串和对象。因此,要处理多值字段,您可以传入一个ArrayList,其中包含第二个参数的所需值,SolrJ将相应地更新多值字段:
String[] valuesArray = {"value1", "value2", "value3"};
ArrayList<String> values = new ArrayList<String>(Arrays.asList(valuesArray));
solrInputDocument.addField("Field1", values);
答案 1 :(得分:6)
您可以多次调用SolrInputDocument.addField(String name, Object value)
作为值传递Object
或传递Collection
作为值的一次。
示例#1:
ArrayList<String> values = Arrays.asList({"value1", "value2", "value3"});
solrInputDocument.addField("field", values);
示例#2:
solrInputDocument.addField("field", "value1");
solrInputDocument.addField("field", "value2");
solrInputDocument.addField("field", "value3");
这两个例子都会产生同样的结果。如果需要,您甚至可以混合和匹配呼叫。要查看其工作原理,请将调用跟踪到Solr源代码中,然后您将发现多值案例在SolrInputField.addValue(Object v, float b)
中处理。
/**
* Add values to a field. If the added value is a collection, each value
* will be added individually.
*/
@SuppressWarnings("unchecked")
public void addValue(Object v, float b) {
if( value == null ) {
if ( v instanceof Collection ) {
Collection<Object> c = new ArrayList<Object>( 3 );
for ( Object o : (Collection<Object>)v ) {
c.add( o );
}
setValue(c, b);
} else {
setValue(v, b);
}
return;
}
boost *= b;
Collection<Object> vals = null;
if( value instanceof Collection ) {
vals = (Collection<Object>)value;
}
else {
vals = new ArrayList<Object>( 3 );
vals.add( value );
value = vals;
}
// Add the new values to a collection
if( v instanceof Iterable ) {
for( Object o : (Iterable<Object>)v ) {
vals.add( o );
}
}
else if( v instanceof Object[] ) {
for( Object o : (Object[])v ) {
vals.add( o );
}
}
else {
vals.add( v );
}
}
答案 2 :(得分:2)
由于我没有使用SOLRJ向SOLR添加元素,我不太确定,但我认为你应该使用
solrInputDocument.addField(Field1, "value1");
solrInputDocument.addField(Field1, "value2");
solrInputDocument.addField(Field1, "value3");
答案 3 :(得分:1)
确认。标记符不会为您“转换”数据。因此,方法是在加载期间处理数据,以使其具有正确的格式。
向你求助。