将multiValued字段添加到SolrInputDocument

时间:2014-01-29 17:16:45

标签: java tokenize solrj

我们正在为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,实际上是添加到文档中的原始字符串。

问题:应该是标记器处理这个问题,还是应该在我们向文档中添加多值字段时自行完成?

感谢。

4 个答案:

答案 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)

确认。标记符不会为您“转换”数据。因此,方法是在加载期间处理数据,以使其具有正确的格式。

向你求助。