2017-11-24 20 views
5

: 필드 ID, 연락처 ID, 등록 및 실행 및 ID에 대한 고유 키를 가진 문서와SOLR 6.6.2 그룹화 된 쿼리

SOLR 구름 모음.

동일한 ContactId를 가진 문서가 여러 개있을 수 있습니다.

각 연락처 문서에는 텍스트 줄을 포함하는 텍스트 필드 속성이 있습니다. 속성 필드는 ','로 구분하여 색인화되므로 예 : 속성 : 녹색 히트. 예를 들어

:

+----+-----------+--------------+ 
| ID | ContactId | Properties | 
+----+-----------+--------------+ 
| 1 | C1  | Blue,Green | 
| 2 | C1  | Blue,Yellow | 
| 3 | C2  | Green,Yellow | 
+----+-----------+--------------+ 

가 지금은 속성이이 쿼리는이 ContactID가의 모든 문서를 통해 일치 "녹색"과 "노란색"를 허용 한 모든 contactID는 찾을 필요가있다. 결과는 C1, C2가 될 것입니다.

결과를 그룹화하려고했지만 여전히 그룹화 된 결과에 대해 쿼리 할 수 ​​없습니다.

group=true&group.field=ContactId&group.query=(Green AND Yellow)&q=(Green OR Yellow) 

내가 다음에 아이디어와 AND 조건 녹색과 노란색의 group.field ContactID가와 나중에 group.query에 그룹화를보다 녹색 또는 노란색 중 하나가 모든 문서를 가져 오는 쿼리 (Q)이었다. 하지만 성공하지 못했습니다.

MYSQL에서 하나 그냥

group_concat(Properties) as grouped 

을 할 것이며, 해당 문자열을 통해 같은 작업을 수행합니다

grouped LIKE '%Green%' AND grouped LIKE '%Yellow%' 

가 어떻게이 SOLR 인덱스에서이 쿼리를 달성 할 수 있습니까?

금리 및없이 제안

지금까지 시도 :

intersect( 
    search(w3, q=Properties:("Green" OR "Green" AND "Yellow"), fl="ContactId", sort="ContactId asc"), 
    search(w3, q=Properties:("Yellow" OR "Green" AND "Yellow"), fl="ContactId", sort="ContactId asc"), 
    on="ContactId") 

을하지만 두 속성은 같은 문서 안에있는 경우 여전히 결과가 와서 : SOLR의 교차의 예에서 파생 된

intersect( 
    search(w3, q=Properties:("Green"), fl="ContactId", sort="ContactId asc"), 
    search(w3, q=Properties:("Yellow"), fl="ContactId", sort="ContactId asc"), 
    on="ContactId") 

동일한 ContactId의 여러 문서로 각 문서가 분할되어있는 것은 아닙니다 (이 경우 C2 만 가능하지만 C1은 그렇지 않습니다).

+0

기존 데이터 모델을 사용해야합니까? 그래서 당신을 위해 색인 시간 조인은 가능하지 않습니까? – Mysterion

+0

아니요, 변경할 수 없습니다 – gantners

답변

1

당신은 문서를 모두 쿼리 사이 contained in the intersection (하나 개의 쿼리가 Yellow 일치 즉, 하나 Green 일치)를 Streaming Expression을 사용하고 인출하여이 작업을 수행 할 수 있습니다 :

intersect(
    search(collection, q=Properties:Yellow, fl="ContactId", sort="ContactId asc"), 
    search(collection, q=Properties:Green, fl="ContactId", sort="ContactId asc"), 
    on="ContactId" 
) 

당신은 expr 매개 변수를 통해 스트리밍 식을 줄을 요청 처리기 /stream 또한 컬렉션의 Solr 관리 인터페이스에서 "Stream"아래에서 직접 (expr=없이) 테스트 할 수 있습니다. 그 외에는

, 그것은 어떤 존재 어딘가에 텍스트를했다 요소를 포함하는 것 같은 정말, 동일한 작업을 수행하지 않을 MySQL의 예 - 그래서 "다크 그린"가양를 준 것이다.

+0

그 방법을 시도했지만 올바른 결과를 제공하지 않습니다. 보이는 것처럼, 교차점은 C1, Doc1, Green의 경우와 노란색의 경우 Doc2와 다른 반환 된 문서를 기반으로 수행됩니다. 하지만 대신 반환 된 문서의 속성 ContactID에 교차로가 필요합니다. – gantners

+0

교차 연산자는 교차 연산자에 대해 'on'으로 지정된 필드에서 수행해야합니다. 이 필드를 기준으로 정렬하는 것이 중요합니다. 교차 연산자가 두 스트림에서 다음 문서로 진행하는 방법을 알기 때문입니다. 이 표현의 결과와 함께 실패한 예제가 있습니까? – MatsLindh

+0

그게 전부라고 생각했는데 결과가 다르게 알려줍니다. 나는 당신들을 시험해 보았습니다. – gantners