2017-12-01 3 views
1

나는이처럼 보이는면 필드를 쿼리하고있는 동안 값 index : f.brand.facet.sort=index을 기준으로 패싯 값을 정렬합니다.SOLR 주문 패싯은 대소 insentive면 결과에 원래 값을 유지

이 나에게이 같은 결과를 제공합니다

Aaaa (5) 
Bbbb (14 
Cccc (8) 
abbb (29) 

내가 대소 문자를 구별 값을 정렬하고 싶은, 그래서 새로운 fieldTypeLowerCaseFilterFactory를 사용하기 위해 노력을 :

<fieldType name="text_facet" class="solr.TextField"> 
    <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

다시 인덱싱 후 결과는 다음과 같습니다.

aaaa (5) 
abbb (29) 
bbbb (14) 
cccc (8) 

주문이 cor입니다. rect하지만 값은 이제 LowerCase입니다.

나는이 결과를 싶습니다

Aaaa (5) 
abbb (29) 
Bbbb (14) 
Cccc (8) 

대부분의 게시물이 여기에 copyField 만들 말해,하지만 난 그게면 - 쿼리에 올 때 나는 두 개의 필드를 결합 할 수있는 방법을 이해하지 않습니다.

쿼리 할 때 원래 값을 유지하면서 대소 문자를 구분하지 않고 패싯 값을 정렬하는 방법이 있습니까?

+0

항상 모든 패싯 항목을 검색하고 있습니까? 나는. 클라이언트 측을 분류 할 수 있습니까? – MatsLindh

+0

@MatsLindh 아니, 아닙니다. 나는 솔라가 정렬을 처리하게하는 우아한 방법을 찾고있다. – Rob

+0

그렇다면 Solr Faceting (스트리밍 표현과 함께 해킹이 가능할 수도 있음)만을 사용하는 완벽한 솔루션을 얻지 못할 것이라고 생각합니다. faceting을 가진 페이로드는 아마도이 문제를 해결할 수 있지만, 현재로서는 어떤 형태로도 구현되지 않았습니다. 또 다른 옵션은 소문자로 된 값과 분리 기호 (즉, 인덱스'aaaa; Aaaa'와'bbbb; Bbbb '그런 다음 프론트 엔드에서 분리 기호로 분리하십시오. 이것은 다른 대소 문자에 대해 다른 수를 줄 수 있지만 문제가되지 않을 수도/어쨌든 바람직 할 수도 있습니다. – MatsLindh

답변

1

우선,이 작업을 수행하는 직접적인 방법은 없습니다. 나는 copyField을 사용하는 제안이 뭔가 다른 것 같지만 잠재적으로 도움이 될 수 있다고 생각합니다.

아이디어는 다음입니다 : 당신이 lowercasing으로 copyField이보다 당신이 브랜드에게 유형 string 필드를 만듭니다.

<field name="brand" type="string" indexed="true" stored="false"/> 
<field name="brand_text" type="text_facet" indexed="true" stored="false"/> 
<fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true"/> 

<fieldType name="text_facet" class="solr.TextField"> 
     <analyzer type="query"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
</fieldType> 

<copyField source="brand" dest="brand_text" /> 

질의 시간 동안, 당신은 페이스 팅에 대한 두 필드를 쿼리 - 귀하의 경우에 이런 식으로 뭔가 (내가 일부 문서를 추가 한)입니다 :

brand:[Aaaa (1), Bbbb (1), Cccc (1), aBbb (1), abbb (1)] 
brand_text:[aaaa (1), abbb (2), bbbb (1), cccc (1)] 

을 즉시 정렬 얻을로 brand_text에 의해 원래의 패싯 값을 얻고 어떻게 든 적절한 응답을 제공 할 수 있습니다.

그러나 비슷한 소문자 값을 혼합 할 수 있음을 지적하고자합니다. 여기서는 소문자 모드에서 정확히 동일하게 ABbbabbb을 사용합니다. 질문은 거기에 표시하고자하는 것이므로 비즈니스 로직 측면에서 올바르게 처리되어야한다고 생각합니다.

Solr faceting을 담당하는 org.apache.solr.handler.component.FacetComponent을 확장하면 완전히 해결할 수 있습니다.

 boolean countSorted = dff.sort.equals(FacetParams.FACET_SORT_COUNT); 
     if (countSorted) { 
     counts = dff.countSorted; 
     if (counts == null || dff.needRefinements) { 
      counts = dff.getCountSorted(); 
     } 
     } else if (dff.sort.equals(FacetParams.FACET_SORT_INDEX)) { 
     counts = dff.getLexSorted(); 
     } else { // TODO: log error or throw exception? 
     counts = dff.getLexSorted(); 
     } 

getLexSorted이 용어를 분류 정확히 무엇 :이 정렬을 수행하는 코드이다

Arrays.sort(arr, (o1, o2) -> o1.indexed.compareTo(o2.indexed)); 

은 당신은 단지 o1o2 모두 toLowerCase()를 적용해야합니다. 그러나이 방법은 훨씬 더 어려울 것입니다. 기존 FacetComponent를 확장하고 나중에 CI, 등을 포함하여 solrconfig.xml에서이를 활성화해야합니다.

+0

답장을 보내 주셔서 감사합니다. 이것은 정확히 제가 생각한 것입니다. 2 개의 서로 다른 패싯 필드는 오류가 발생할 수 있으며 잘 확장되지 않습니다 (원래 브랜드 이름을 추적하거나 모든 패싯 값을 쿼리해야하기 때문에). 필자는 ' FacetComponent' 클래스를 사용하지만, 가장 우아한 방법 인 것처럼 보이기 때문에 살펴볼 것입니다. – Rob

+0

@Rob, 불행히도 Solr 쪽을 처리 할 수있는 유일한 방법입니다. 일반적으로 브랜드 이름을 유지해야합니다 (그냥 예를 들면) 일관된 AC 전체 카탈로그를 선호하는 양식으로 작성하십시오. – Mysterion

+0

상표명을 일관되게 유지할 수있는 방법이 없기 때문에 상표명으로 CamelCasing을 시작할 수 없습니다. – Rob

관련 문제