2011-04-28 4 views
3

solr을 사용자 정의하여 특정 필드를 검색하는 방법을 변경할 수 있는지 확인하려고합니다.Solr이 특정 필드를 검색하는 방법 사용자 정의

더 나은 상황과 질문을 여기에 내가 뭘 원하는지 이해하기 - 내가 5 개 필드가 그들 모두가 텍스트 필드 것 [구문에 너무 많이 읽어 해달라고 ..]

<field>a</field> ==> will contain normal text [lazy fox jumps over ..] 
<field>b</field> ==> will contain normal text [lazy fox jumps over ..] 
<field>c</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6] 
<field>d</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6] 
<field>e</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6] 

내 쿼리는이 5 개의 필드를 모두 검색하고 필드 c, d & e의 값에는 쉼표로 구분 된 숫자 값이 포함됩니다.

검색 중에 인덱스의 값 내에서 & 쿼리의 값 사이의 교차를 수행하고 싶습니다. 내가 어떻게 할 수 있니?

=> 문제를 보는 다른 방법은 쿼리 필드의 값 중 하나가 색인 내의 필드에 있으면이 문서를 반환하여 반환해야한다는 것입니다. 이것은 단순한 "OR"검색처럼 보이지만 각 필드 내의 값은 100의 순서 일 수 있습니다. 그래서 많은 가능한 입력 값에 대한 OR 쿼리를 생성하는 것은 꽤나 비슷합니다. 이것이 잘 확장되면 가능한 솔루션 일 수는 있지만 확장이 잘되는지 확실하지 않습니다.

어떻게 이러한 맞춤 설정을 구현할 수 있습니까? - 검색/쿼리 성능이 고려 될 핵심 요소입니다.

답변

0

필드 c d 및 e의 경우 값을 구분 기호로 분리하고 여러 값 필드로 저장해야 각 단일 값과 일치시킬 수 있습니다.

그래서 당신의 쿼리는 기본 쿼리 연산자 OR이라고 가정

q=a:(query) b:(query) c:(query) d:(query) e:(query) 

된다.

+0

기본 쿼리 연산자는 필드간에 만 적용 할 수 있습니까? 즉, a, b, c, d 및 e 사이. 다른 필드와 각 필드에서 기본 쿼리 연산자를 지정할 수 있습니까? - 다른 방법은 OR을 지정하고 쿼리에서 AND를 명시 적으로 지정하는 것입니다. – karthik

+0

아니요, 기본 연산자는 따옴표로 묶어 문구를 만들지 않는 한 공백으로 구분 된 모든 용어에 대해 작동합니다. – Umar

-1

copyField 옵션을 사용할 수 있습니다. 예를 들어 'composite'와 같은 이름을 가진 필드를 만듭니다.

과도한 메모리 사용을 방지하려면 false를 저장하십시오.

c와 동일한 유형 & e. & 필드를 'composite'으로 복사하십시오.

q=a:(query) AND composite:(query) 
+0

copyField는 하나의 소스에서 하나의 대상으로 만 사용할 수 있습니다. 당신이 제안하는대로 많지 않습니다. – harschware

+1

위의 copyField를 사용하면 원하는 필드를 하나의 대상 필드에 복사 할 수 있습니다. 예제를 확인해 보았다면 기본 스키마 파일에서 복사 필드로 텍스트를 사용할 수 있습니다. 대상 필드가 다중 값 필드로 정의되어 있는지주의해야합니다. – Umar

0

에 대한 필드 C D 및 다른 다중 값 필드에 (구분 기호로) 값을 분할한다 E :

<copyField source="c" dest="composite"> 

<copyField source="d" dest="composite"> 

<copyField source="e" dest="composite"> 

그런 다음 쿼리의 뜻과 같은 다음과 같이 보인다. @Umar가 암시 하듯이. 그런 다음 숫자를 검색 할 수있는 단일 필드가 있습니다 (이 필드를 "숫자"라고 함). (쿼리) B : (쿼리) 숫자 : (쿼리)

기본 쿼리 연산자는 OR이라고 가정

때문에 쿼리는

Q = A가된다.

간단한 평등 검색을 원하면 필드 "numbers"가 문자열이어야합니다. 이 숫자에 대해 범위 검색을 허용하려면 int이어야합니다.

숫자가 항상 예측 가능한 형식 (예 : 사용자 입력에서 나오는 것은 아님)에 염려되는 경우 c 필드의 내용을 단일 텍스트 필드로 복사 할 수 있습니다. 이렇게하면 훨씬 더 느슨한 일치 기능이 제공되지만 범위 검색 등을 수행 할 수 없습니다. IIRC, SOLR의 복사 필드를 사용하면 불만없이 하나의 대상 필드에 많은 원본 필드를 지정할 수 있지만 문서를로드하면 대상 필드는 실행 된 마지막 copyField의 내용을 가져옵니다. 따라서 여기서는 작동하지 않으며 코드의 단일 필드로 내용을 연결해야합니다.

+0

문제는 이러한 모든 값을 하나의 필드에 병합 할 수 없다는 것입니다. 그들은 액세스 제어와 같으며 각 필드는 중요성을 가지며 필드 중 하나가 일치하지 않아도 문서와 일치하지 않아야합니다. 이 두 분야의 AND입니다. – karthik

+0

그러면 모든 텍스트 필드를 사용하고 괄호 안의 AND와 필드 사이의 OR을 사용하십시오. 쉬운. 모든 필드 검색어를 괄호로 묶습니다. 예. (a : (쿼리) AND b : (쿼리)) 또는 (c : (쿼리) 또는 d : (q1과 q2)) 또는 당신이 상상하는 논리 식. – harschware

+0

제안 해 주셔서 감사합니다. 각 분야에 수천 개의 항목이있을 때의 성과에 대한 단서가 있습니까? 에는 Solr 내에서 효율적으로이를 수행 할 수있는 사용자 정의 검색 구성 요소를 작성하는 방법이 있습니다. 위의 접근 방식으로 우리는 쿼리 조건을 엄청나게 늘려 시스템의 모든 검색에 적용 할 수 있으므로이 디자인이 어떻게 수행 될지 약간 걱정했습니다. – karthik

관련 문제