2014-01-29 57 views
4

我們使用Java SolrJ的solr嵌入實例。將multiValued字段添加到SolrInputDocument

我想將多值字段添加到文檔。多值字段是一個昏迷分離的字符串。

在Java中我想做的事:

solrInputDocument.addField(Field1, "value1,value2,value3"); 

在架構字段1的定義如下

<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。

相反,我們得到一個只有一個值的數組列表,它實際上是添加到文檔中的原始字符串。

問題:應該是標記器處理此問題,還是應該在我們向文檔添加多值字段時自己執行?

謝謝。

回答

2

,因爲我不使用SOLRJ添加元素SOLR我真的不知道,但我認爲你應該使用

solrInputDocument.addField(Field1, "value1"); 
solrInputDocument.addField(Field1, "value2"); 
solrInputDocument.addField(Field1, "value3"); 
+0

針對您的答案,它是我發現的唯一途徑。 – Sal81

10

SolrInputDocument的addField方法接受字符串和對象。所以,處理多值字段,你可以通過與第二個參數所需值的ArrayList和SolrJ將相應地更新多值字段:

String[] valuesArray = {"value1", "value2", "value3"}; 
ArrayList<String> values = new ArrayList<String>(Arrays.asList(valuesArray)); 
solrInputDocument.addField("Field1", values); 
+0

爲您的答案的Thnks,它是我發現的唯一方法。 – Sal81

1

證實。 Tokenizers不會爲您「投射」數據。所以,這種方法是在加載時間內處理數據,以適當的格式。

Thinks for your help。

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); 
    } 
}