2010-02-11 5 views
3

기본적으로 Solr은 검색 매개 변수에 대해 다중 값 필드의 각 레코드를 검색하려고합니다. 내 예제에서 읽으십시오 :Solr, 다중 값 필드에서 고유 한 값 집합에 대한 하나의 필드에 대해 쿼리하는 방법

Solr을 사용하여 데이터를 색인화합니다. 주어진 제품과 일치하는 병렬 배열 (다중 값 필드 형식)의 응용 프로그램 데이터가 있습니다. 내 선택 범위를 좁힐 필터 쿼리 (& FQ의 =)를 사용하고

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
<-solr record end->

: 제조업체, 모델 및 연도가 필드를 여러 값을 다음 예를 참조하십시오. 문제는 누군가 2000 년 Acura Integra를 찾으면 위의 기록과 일치하지만 제조업체, 모델 및 연도 데이터가 병렬로 인코딩되기 때문에 실제로이 제품에는 2000 년 Acura Integra가 없습니다. Solr은 make 필드의 make, 모델 필드의 모델, year 필드의 해를 (필연적으로) 일치시키고이 결과를 반환하고, 내 병렬 처리를 존중하지 않습니다. 내 쿼리 지금까지 같을 것이다 :


fq=make:"acura"&fq=model:"integra"&fq=year:2000 (I would normally escape URL characters when I POST to Solr, this is just an example)

그래서 내 솔루션은 내가 모든 제조사, 모델, 연도 및 기타 데이터를 둘 것입니다있는 요약 필드라는 또 다른 다중 값 필드를 생성하는 것이다 (같은 엔진)을 함께 공간으로 분리합니다. 여러 단어로 된 용어가 부주의하게 검색 매개 변수와 일치하지 않도록 단어 주위에 인용 부호가 필요합니다. 위의 예는 지금과 같을 것이다 :

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
summary: "acura" "integra" "1997" "3.4", "acura" "rsx" "2004" "4.5", "acura" "rsx" "2000", "4.5"
<-solr record end->

나는 다음 내 쿼리에 추가

summary:(""acura" AND "integra" AND "2000")

내가 기대, 나는 나의 질문에, 그이를 추가 한 경우 요약 필드에 acura integra 2000이 없으므로 기록이 더 이상 나타나지 않습니다. 그러나 이것은 작동하지 않습니다. 기록은 여전히 ​​나옵니다. 나는 곤두박질 친다. 누구든지이 문제에 대한 해결책을 가지고 있습니까? 며칠 동안 나를 죽였어.

기본적으로 Solr은 내 검색 매개 변수에 대해 다중 값 필드의 각 레코드를 검색하려고합니다. 가능한가요? 내가하려는 일을하는 더 좋은 방법이 있습니까?

감사합니다.

답변

3

요약 필드가없는 경우 병렬 처리를 유지하는 방법에 대해서는 여전히 확신 할 수 없지만 요약 필드로 처리하는 방법을 알아 냈습니다.대신 다중 값 필드의 각 레코드를 검색하여 AND (각 AND'ed 용어는 반드시 같은 행이 아닌 다중 값 필드의 다른 행과 일치 할 수 있음)하는 AND 구문을 사용하는 대신 정확한 조건을 입력하십시오. 찾고자하는 내용을 원본 요약 레코드를 빌드 한 순서대로 저장하고 ~ 연산자를 사용하십시오.

다음의 예를 살펴 보자 여기 "Honda" "Accord" "2004" "3.5L"

가 있습니다 : 다음

내가 일치하고자하는 다중 값 필드의 행 중 하나의 요약 필드의 내용입니다을 쿼리를 실행합니다 : summary_field:("\"Honda\" \"2004\"")

위의 쿼리만으로는 작동하지 않습니다. 응용 프로그램의 사용자가 임의의 순서로 데이터 (제조업체, 모델 연도)를 입력 할 수 있기 때문에 원래 요약 필드와 동일한 순서로 응용 프로그램의 사용자 입력을 넣는 기능을 가질 수는 있지만 일치 시키려고하는 데이터 사이에 다른 단어가있을 수 있습니다. 위의 샘플에서 Honda 2004를 해당 레코드와 대조하고 싶습니다. 그러나 합의는 그 사이에 있습니다.

이 문제를 해결하려면 간단히 ~ n 연산자를 사용하십시오. 여기서 n은 검색하는 용어 사이의 다른 용어의 최대 개수입니다. 그래서 내가 대신 사용하는 경우 : 나는 혼다과 2004 년 사이에,이 일 개 다른 단어 인 가능성이 있다고 말하고

summary_field:("\"Honda\" \"2004\""~1)

. 따라서 위의 쿼리는 일치합니다. 요약 필드에 여러 용어를 추가하더라도 동일한 순서로 값을 사용하여 쿼리를 수행하고 퍼지 검색 로직이 2 개의 값 사이의 최대 거리가되는 숫자를 사용하는 경우 쿼리가 항상 올바르게 일치합니다 올바른 요약 필드. 따라서 요약 필드에 20 개의 필드를 추가하여 병렬 처리를 유지하려면 사용자가 선택할 수있는 단어 사이의 최악의 시나리오에서 가능한 최대 거리 인 ~ 18을 사용해야합니다.

3

스키마가 올바르지 않은 것으로 보입니다. 데이터를 완전히 비정규 화하고 차량 당 하나의 문서를 만들어야합니다. "차량"이 의미하는 것은 어떤 종류의 검색을 실행할 것인가에 달려 있습니다. 예를 들어, 가능한 스키마는 다음과 같습니다

sku: 1234 
make: acura 
model: integra 
years: 1997 
engines: 3.4, 4.5 

sku: 1235 
make: acura 
model: rsx 
years: 2000, 2004 
engines: 4.5 

요약 필드는 다음과 같이 그냥 쿼리를 할 수 없습니다 메이크업 + 모델 + 년 + 엔진

+0

안녕하세요. 이것은 정확하게 원래의 솔루션이었고 완벽하게 작동합니다! 유일한 문제는 내 사이트의 제품 화면으로 이동하면 제품 수 대신 응용 프로그램 수가 표시된다는 것입니다. 동일한 제조업체, 모델 및 연도가 SKU에 속하고 엔진이나 하위 모델 만 다른 경우 해당 제품 아래의 "맞는"섹션에 설명되어 있습니다. 예를 들어, 4 개의 응용 프로그램을 내 사이트의 1 제품 "상자"에 함께 표시 할 수 있습니다. 검색 결과에 1의 1이 표시되어야합니다. 대신 4 개의 4 중보기가 표시됩니다 (화면에 하나의 상자가 있음에도 불구하고). 따라서 새로운 스키마 ... – Dan

+0

@ Dan : 필드 접기를 살펴보십시오. http://wiki.apache.org/solr/FieldCollapsing –

+0

SKU (12345)는 여러 차량에 적합하기 때문에 문제가됩니다. 각 SKU + 차량 1 대는 자체 기록으로 좋지만 고객으로 보는 것은 끔찍합니다. 각 차량 (및 응용 프로그램)을 롤업하고 해당 차량에 맞는 SKU에 연결하면 더 쉽게 볼 수 있습니다. Howver, 페이지 당 10 개의 응용 프로그램을 볼 수도 있지만 사용자가 무언가를 살 수있는 상자가 3 개 밖에 없습니다. 그래서 그것은 항목 1에서 10까지를 보지 만 그림과 함께 3 개의 "상자"와 "구매 버튼 클릭"이 나열되어 있습니다. – Dan

0

의 copyField 것입니까?

make:acura AND model:integra AND year:2000 

.l.e. make와 모델을 인용하지 않고.