2012-11-13 3 views
9

내 SOLR 주소 데이터베이스와 관련된 문제를 고민하는 데 어려움을 겪고 있습니다.SOLR 4.0 알파벳 순 정렬 문제

예제 파일에서이 파일을 만들었습니다. 기본적으로 수정 된 스키마를 사용하여 예제 구성을 실행하고 있습니다.

의 schema.xml :

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="_version_" type="long" indexed="true" stored="true" required="false" multiValued="false" /> 

<field name="givenname_s" type="text_de" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="middleinitial_s" type="text_de" indexed="false" stored="true" required="false" multiValued="false" /> 
<field name="surname_s" type="text_de" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="gender_s" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="pictureuri_s" type="string" indexed="false" stored="true" required="false" multiValued="false" /> 
<field name="function_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="organizationalunit_s" type="text_general" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="organizationalunitdescription_s" type="text_de" indexed="false" stored="true" required="false" multiValued="false" /> 
<field name="company_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="street_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="streetnumber_s" type="int" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="postcode_s" type="int" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="city_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="building_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="roomnumber_s" type="int" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="country_s" type="text_en" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="countrycode_s" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="emailaddress_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="phone1_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="phone2_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="mobile_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="fax_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 

나는 다음과 같은 post.jar 에 같은 약 20.000 임의의 테스트 데이터 세트를 밀어 데이터베이스를 채우는 오전 : 그러나 불러 오는

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<add> 
    <doc> 
     <field name="id">1352498443_1</field> 
     <field name="givenname_s">Aynur</field> 
     <field name="middleinitial_s"/> 
     <field name="surname_s">Lehnen</field> 
     <field name="gender_s">F</field> 
     <field name="pictureuri_s">dummy_assets/female.jpg</field> 
     <field name="function_s">Zugschaffner/in</field> 
     <field name="organizationalunit_s">P 07</field> 
     <field name="organizationalunitdescription_s">Lorem Ipsum sadipscing voluptua ipsum invidunt dolor et dolore invidunt sed consetetur accusam dolore Lorem tempor.</field> 
     <field name="company_s">Lorem Lagna Epsum Emet</field> 
     <field name="street_s">Erlenweg</field> 
     <field name="streetnumber_s">82</field> 
     <field name="postcode_s">76297</field> 
     <field name="city_s">Lübeck</field> 
     <field name="building_s"/> 
     <field name="roomnumber_s">242</field> 
     <field name="country_s">GERMANY</field> 
     <field name="countrycode_s">DE</field> 
     <field name="emailaddress_s">[email protected]</field> 
     <field name="phone1_s">0392984823</field> 
     <field name="phone2_s">0124111417</field> 
     <field name="mobile_s">0325117132</field> 
     <field name="fax_s">0171459177</field> 
    </doc> 
</add> 

데이터 알파벳 순 정렬에 문제가있는 것 같습니다. 다음과 같은 쿼리를 고려해보십시오.

{ 
    "responseHeader": { 
     "status": 0, 
      "QTime": 5, 
      "params": { 
      "sort": "surname_s asc", 
       "fl": "surname_s", 
       "indent": "true", 
       "wt": "json", 
       "q": "city_s:berlin" 
     } 
    }, 
     "response": { 
     "numFound": 1094, 
     "start": 0, 
     "docs": [{ 
      "surname_s": "Weil" 
     }, { 
      "surname_s": "Abel" 
     }, { 
      "surname_s": "Adam" 
     }, { 
      "surname_s": "Ade" 
     }, { 
      "surname_s": "Adrian" 
     }, { 
      "surname_s": "Aigner" 
     }, { 
      "surname_s": "Aigner" 
     }, { 
      "surname_s": "Alber" 
     }, { 
      "surname_s": "Alber" 
     }, { 
      "surname_s": "Albers" 
     }] 
    } 
} 

"Weil"이 위치 1에 있고 나머지 데이터는 올바르게 정렬 된 것처럼 보이는 이유는 무엇입니까?

답변

14

필자는 text_de 필드 유형에 적용되는 추가 분석기 중 일부가이 정렬 동작의 원인이라고 생각합니다. 내 경험상, 문자열을 정렬 할 때 최상의 결과를 얻으려면 아래에 표시된 예제 schema.xml과 함께 제공되는 alphaOlySort fieldType을 사용하는 것이 좋습니다.

<fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" 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" /> 
    <!-- The PatternReplaceFilter gives you the flexibility to use 
     Java Regular expression to replace any sequence of characters 
     matching a pattern with an arbitrary replacement string, 
     which may include back references to portions of the original 
     string matched by the pattern. 

     See the Java Regular Expression documentation for more 
     information on pattern and replacement string syntax. 

     http://java.sun.com/j2se/1.6.0/docs/api/java/util/regex/package-summary.html 
     --> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="([^a-z])" replacement="" replace="all" 
    /> 
    </analyzer> 
</fieldType> 
나는 새 필드를 만든 다음, copyField를 통해 surname_s에서 뭔가를 값을 복사하는 것이 좋습니다

다음

<field name="surname_s_sort" type="alphaOnlySort" indexed="true" stored="false" required="false" multiValued="false" /> 

<copyField source="surname_s" dest="surname_s_sort"/> 

참고 :에 값을 저장 할 필요가없는 surname_s_sort 필드이므로 사용자에게 표시하지 않으려면 stored="false" 속성을 사용하십시오.

그런 다음 쿼리를 변경하여 surname_s_sort에서 정렬 할 수 있습니다.

+1

입니다. –

+2

당신의 가정은 절대적으로 옳습니다. "weil"은 GermanAnalyzer의 말을 멈추게합니다. –

+0

완벽한 !! 고마워요 페이지 쿡. 그것은 효과가 있었다. – atpatil11

4

다중 값 필드 및 토큰 화 필드에서 정렬이 제대로 작동하지 않습니다.

Documentation-
이 문서의 "점수"에서 수행, 또는 다중 값 = "false"를 색인 = "true"로 필드에 해당 필드를 제공 할 수 소트입니다 중 하나가 아닌 토큰 (예 : 더 분석기가 없습니다) 단일 용어 만 생성하는 분석기를 사용합니다 (예 : KeywordTokenizer 사용)

문자열을 필드 유형으로 사용하고 제목 필드를 새 필드에 복사하십시오.

<field name="surname_s_sort" type="string" indexed="true" stored="false"/> 

<copyField source="surname_s" dest="surname_s_sort" /> 

것은 @Paige는 키워드 토크 나이 필드를 토큰 화하지 않는 소문자 필터를 가질 수 대답한다.

0

나는 비슷한 문제가 있었고 alphaOnlySort를 시도했습니다. 일부분은이 작업을하지만 필드에 -,/spaces 등의 값이 들어있을 때 정렬 결과가 엉망이되기 시작합니다.

그래서 결과는 같은했다

  1. /ABC
  2. AA

그래서 내가 필드 유형 소문자를 사용하여 종료

  • /abc2. 이미 그곳에 있었기 때문에 나는 그것의 기본 유형이라고 생각했습니다. 복사 필드 구성을 사용 했으므로 최종 설정은

    <schema> 
        <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100"> 
         <analyzer> 
         <tokenizer class="solr.KeywordTokenizerFactory"/> 
         <filter class="solr.LowerCaseFilterFactory" /> 
         </analyzer> 
        </fieldType> 
        <fields> 
         <field name="job_name_sort" type="lowercase" indexed="true" stored="false" required="false"/> 
        </fields> 
        <copyField source="job_name" dest="job_name_sort"/> 
    </schema>