2011-04-27 2 views
68

저는 Apache Solr을 처음 사용합니다. documentation 부분을 읽은 후에도 기능 및 필드 유형 속성 multiValued의 사용을 명확하게 이해하기 어렵습니다.Solr에서 "multiValued"필드 유형을 사용하는 것은 무엇입니까?

내부적으로 Solr은 으로 표시된 필드를 처리/처리합니다. multiValued?

의 값이 인 Solr의 색인 생성의 차이점은 무엇입니까?

누군가 좋은 예를 들어 설명 할 수 있습니까?

박사는 말한다 :

다중 값 = 참 | 거짓

이 문서에 여러 번 나타날 수있는 경우이 필드, 즉 문서 당 여러 개의 값을 포함 할 수 있습니다 경우는 true

답변

68

다중 값 필드는 필드에 둘 이상의 값이있는 경우 유용합니다. 쉬운 예가 태그 일 것입니다. 색인을 생성해야하는 여러 개의 태그가있을 수 있습니다. 그래서 만약 우리가 다중 값을 가진 tag 필드를 가지고 있다면 solr 응답은 문자열 값 대신에리스트를 반환 할 것입니다. 주의 할 점은 당신이 좋아하는 태그의 각 값에 대해 여러 줄을 제출해야한다는 것입니다 :

 
<field name="tags">tag1</tags> 
<field name="tags">tag2</tags> 
... 
<field name="tags">tagn</tags> 

당신이 값, E, G로 검색하거나 필터 결과 수있는 모든 값의 인덱스가 한 번.당신이

q=tags:tag1 

같은 쿼리를 사용하여이 tag1 모든 문서를 찾거나

q=query&fq=tags:tag1 
+5

'검색 또는 필터 결과를 어떤 값으로'하는 것의 차이점은 무엇입니까? 이 경우 * 태그로 검색 할 때의 차이점은 무엇입니까? 'q'또는 'fq'에 tag1 *이 있습니까? – Gnanam

+1

각 값은 문자열 일 수 있으며 문자열 집합과 정확하게 일치시킬 수 있습니다. 단일 값 필드의 경우 토큰 화 된 단어 또는 전체 문자열을 가질 수 있습니다. 또 다른 용도는 태그의 경우에 언급 한대로 목록 인 값을 저장하는 것입니다. 숫자 값 목록과 같은 숫자가 될 수 있습니다. – Umar

+6

@Gnanam : 필터링 된 쿼리는 캐시되며 점수에 영향을주지 않습니다. 그들의 주요 목적은 문서의 고정 된 "수퍼 세트 (superset)"를 생성하여 검색 할 수 있도록하는 것입니다. 예 : 사용자가 쿼리를 입력하고 응용 프로그램이 추가 제약 조건을 적용합니다 (예 : 사용자가 소유 한 문서 만 검색하는 경우). 이 경우 응용 프로그램은 "주어진 사용자 만"을 "fq"로, 실제 검색 쿼리를 "q"로 보냅니다. –

14

필드에 둘 이상의 값이 허용되는지 여부는 스키마에 정의 된 multiValued입니다. 예를 들어

:

doc { 
    id : [ 1, 2] 
    ... 
} 

는 예외가 인덱싱 스레드에서 슬로우 것이며 문서가됩니다
나는 이와 같은 다중 값이 = 거짓 색인 문서를하는 fieldType라는 ID가있는 경우 인덱싱되지 않음 (스키마 유효성 검사가 실패 함) 나는 필드에 여러 값이있는 경우 반면에

나는 예를 들어, 제대로되는 인덱싱을 보장하기 위해 다중 값 = true를 설정하고자하는 것입니다 : 당신이 것이 경우

doc { 
    id : 1 
    keywords: [ hello, world ] 
    ... 
} 

을 "keywords"를 multiValued 필드로 정의하십시오.

+1

정확하게 이해했는지 여부를 알려주세요. 예를 들어,'DataImportHandler'를 사용하여 데이터베이스에서 직접 데이터를 인덱싱하려고하면 데이터베이스 필드 * tag * 유형 중 하나가 VARCHAR [] (varchar 배열)이면이 * tag * 필드를 매핑하는 것이 합리적입니다 태양계 스키마 필드에서 multiValued로. 내 이해가 정확합니까? – Gnanam

+1

여기 게임에 늦었지 만 일반적으로 그렇다고 말할 것입니다 ... 결코 결코 말하지 말고 결코 말하지 마십시오 – markg

12

난 단지 copyfields 여러 값 필드를 사용하기 때문에이 방법을 생각처럼 결과를 필터링하기 위해 태그를 사용할 수 있습니다, 모든 필드는 말한다 그것은 copyfield가 아니라면 하나의 예를 들어 나는 다음과 같은 필드가, 평가 될 것이다 : 나는 위의 모든 4 개 필드를 검색 만 가능한 하나 개의 필드를 조회 할

<field name="id" type="string" indexed="true" stored="true"/> 
<field name="name" type="string" indexed="true" stored="true"/> 
<field name="subject" type="string" indexed="true" stored="true"/> 
<field name="location" type="string" indexed="true" stored="true"/> 

을, 우리는 u를 필요 se copyfield. 새로운 분야 호출 '모든'을 만들 먼저 다음 '모든'

<field name="all" type="text" indexed="true" stored="true" multiValued="true"/> 
<copyField source="*" dest="all"/> 

이제 필드 '전체'에 모든 것을 복사는 다중 값해야합니다.

관련 문제