2014-01-29 2 views
4

Java SolrJ 용 solr 포함 인스턴스를 사용하고 있습니다.SolrInputDocument에 multiValued 필드 추가

문서에 다중 값 필드를 추가하려고합니다. 다중 값 필드는 쉼표로 구분 된 문자열입니다. 자바에서

내가하고 싶은 :

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

우리가 SOLR이었다 addField의 메소드를 호출 할 때 기대했던이 구성

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

를 따를 때 스키마를 Field1에 대한 정의는 multiValuedField인지 검사 할 수 있으므로 String을 다른 값으로 arrayList로 변환합니다.

대신 실제로 문서에 추가 된 원래 문자열 인 단 하나의 값으로 arraylist를 얻습니다.

질문 :이 문제를 처리하는 토크 나이저 여야하며 문서에 다중 값 필드를 추가 할 때 스스로해야합니까?

감사합니다.

답변

2

내가 정말 확실하지 않다 SOLR에 요소를 추가 할 SOLRJ를 사용하고 있지 않다으로,하지만 난 당신이

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

답변에 대한 Thnks, 그 방법은 내가 찾은 것입니다. – 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

을 확인했다. 토큰 화 도구는 데이터를 "캐스팅"하지 않습니다. 따라서 접근 방식은 로딩 시간 동안 데이터를 올바른 형식으로 유지하는 작업입니다.

당신의 도움에 감사드립니다.

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