2017-03-12 5 views
0

SOLR의 문자열 필드에 영숫자 정렬을 시도하고 있습니다. 이제 이것을 위해 제안 된 일반적인 해결책은 패드 번호를 0으로두고 일반 사전 정렬을하는 것입니다. 그러나 이것은 알파벳 앞에 숫자를 넣을 것이고 나의 요구 사항은 숫자 앞에 오는 것이어야한다.SOLR - 영문자와 숫자 순으로 정렬

SOLR을 처음 사용했습니다. 자바 비교기에서이 정렬 논리를 구현할 수 있지만 SOLR에서는 사용할 수 없다. SOLR에서 사용자 지정 함수 (ValueSource)를 사용하여 정렬하는 방법을 살펴 보았지만 이해할 수있는 한 번에 단일 문서의 필드 값에 대해 작업하고 이러한 값을 다른 값에 매핑 할 수 있습니다 (예 : 합계 함수). 지금까지 본 적이있는 비교기와 유사한 상대 점수 기능 (즉, 한 번에 2 개의 문서 비교)이 없습니다. 맞춤 유사성 클래스에 대해 읽었지만이 시나리오에 해당한다고 생각하지 않습니다 (과용 될 수 있습니까?)

어떻게하면됩니까? 내가 생각할 수있는 유일한 (극히 추악하고 끔찍한) 해결책은 꽃 괄호 (테이블에서 가장 큰 ASCII 값을 가짐)를 사용하여 문자열의 모든 숫자를 둘러싸는 맞춤 SOLR 함수를 작성하는 것입니다. 예 : a87a{87}으로 변환됩니다. 이것은 그들을 밀어 붙입니다.

답변

0

내 경험상 사용자 지정 유사성 구현을 피하기 위해 제안합니다.

your case에 맞는 숫자 앞에 알파벳을 넣은 analyzer 체인을 만들 수 있습니다. 뒤에 오는 사슬로 a87는 에 변형시킬 것이다. 그리고 이것이 당신의 정확한 요구 사항에 맞지 않는다면, 당신은 원하는대로 필드 정규 표현식을 사용할 수 있습니다. 당신이 새로운 분야의 창조에 대한 특정 요구 사항이없는 경우

<fieldType name="alphaNumericSort" class="solr.TextField" sortMissingLast="false" omitNorms="true"> 
    <analyzer> 
    <!-- KeywordTokenizer does no actual tokenizing, so the entire 
     input string is preserved as a single token --> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <!-- The LowerCase TokenFilter does what you expect, which can be 
     when you want your sorting to be case insensitive --> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <!-- The TrimFilter removes any leading or trailing whitespace --> 
    <filter class="solr.TrimFilterFactory" /> 
    <!-- Left-pad numbers with zeroes --> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="(\d+)" replacement="00000$1" replace="all" 
    /> 
    <!-- Left-trim zeroes to produce 6 digit numbers --> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="0*([0-9]{6,})" replacement="$1" replace="all" 
    /> 
    <!-- Remove all but alphanumeric characters --> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="([^a-z0-9])" replacement="" replace="all" 
    /> 
    </analyzer> 
</fieldType> 

, 나는 당신의 managed-schema에서 새로 작성하는 것이 좋습니다 것입니다 원래 필드가 복사합니다.

<field name="myNewField" type="alphaNumericSort" indexed="true" stored="true" /> 
<copyField source="sourceField" dest="myNewField" /> 

이 문제를 여전히 맞지 않을 경우

또 다른 해결책은 (항상 앞서 언급 분석기 체인을 사용하여) 하나 개 이상의 새로운 필드 교대로 알파벳과 숫자 부분을 포함하는 그들 각각에 원래 필드를 변환합니다.

이렇게하면 필드 목록을 필요한 순서대로 전달하여 표준 sort 쿼리 절로 정렬 할 수 있습니다.

sort=fieldAlpha1 asc, fieldNumeric1 desc, fieldAlpha2 asc 

또는 Solrj

당신의 응답을
solrQuery.addSortField("fieldAlpha1", ORDER.asc); 
solrQuery.addSortField("fieldNumeric1", ORDER.desc); 
solrQuery.addSortField("fieldAlpha2", ORDER.asc); 
+0

감사의 예를 들면 다음과 같습니다! "숫자 앞에 알파벳을 넣는 분석기 체인을 만들 수 있습니다."- 어떻게해야 하는지를 알 수 없었습니다. 내가 말했듯이, 왼쪽 패딩만으로는 충분하지 않습니다. (숫자가 처음이므로). 제공 한 링크도 똑같습니다. "정규식을 사용하면 원하는대로 필드를 변형 할 수 있습니다."- 내 꽃꽂이 솔루션을 사용할 수 있다는 의미입니까? 새 필드를 만드는 것과 관련해서는 실현 가능성이 있다고 생각하지 않습니다. 나는 2500 개의 그런 필드를 가지고 영숫자를 정렬하고 각각에 대응하는 새로운 필드를 만들면 너무 많은 필드로 이어질 것이다. – Sri

+0

.. 이것이 필드로 저장하는 대신 조작 된 값을 즉석에서 반환하는 사용자 정의 함수를 만들고 싶었던 이유입니다. 또한, 마지막 점 (멀티 정렬)에 관해서 - 문자열에 알파와 num 부분이 번갈아 가며 많이 쓰이면 실패하지 않을까요? 예를 들어 a100b200c300처럼? – Sri

+0

사용자 정의 함수도 관련성에 영향을 미치며 원하는 결과가 아닐 수도 있습니다. 정말로 정렬 할 수있는 2500 자의 영숫자 필드가 있습니까? 데이터의 실제 샘플을 올리시겠습니까? – freedev