내 경험상 사용자 지정 유사성 구현을 피하기 위해 제안합니다.
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);
감사의 예를 들면 다음과 같습니다! "숫자 앞에 알파벳을 넣는 분석기 체인을 만들 수 있습니다."- 어떻게해야 하는지를 알 수 없었습니다. 내가 말했듯이, 왼쪽 패딩만으로는 충분하지 않습니다. (숫자가 처음이므로). 제공 한 링크도 똑같습니다. "정규식을 사용하면 원하는대로 필드를 변형 할 수 있습니다."- 내 꽃꽂이 솔루션을 사용할 수 있다는 의미입니까? 새 필드를 만드는 것과 관련해서는 실현 가능성이 있다고 생각하지 않습니다. 나는 2500 개의 그런 필드를 가지고 영숫자를 정렬하고 각각에 대응하는 새로운 필드를 만들면 너무 많은 필드로 이어질 것이다. – Sri
.. 이것이 필드로 저장하는 대신 조작 된 값을 즉석에서 반환하는 사용자 정의 함수를 만들고 싶었던 이유입니다. 또한, 마지막 점 (멀티 정렬)에 관해서 - 문자열에 알파와 num 부분이 번갈아 가며 많이 쓰이면 실패하지 않을까요? 예를 들어 a100b200c300처럼? – Sri
사용자 정의 함수도 관련성에 영향을 미치며 원하는 결과가 아닐 수도 있습니다. 정말로 정렬 할 수있는 2500 자의 영숫자 필드가 있습니까? 데이터의 실제 샘플을 올리시겠습니까? – freedev