2011-09-28 6 views
0

Solr 데이터베이스의 각 문서에 대해 사용자 지정 "인기"점수를 할당합니다. 기본 맞춤 관련성 점수가 아닌이 맞춤 '점수'입력란을 사용하여 검색 결과를 정렬하길 원합니다.Solr에서 사용자 지정 점수로 정렬하면 일관되게 정렬되지 않음

먼저 내 점수 필드를 정의 :

<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/> 
<field name="score" type="sint" stored="true" multiValued="false" /> 

은 그럼 각 문서의 점수를 삽입 인덱스를 다시. 내가 이런 걸 사용, 쿼리를 실행하려면 :

(text:hello)+_val_:"score" 

가 지금은 문서가 다시 "점수"필드으로 분류 와서 기대를하지만, 내가 대신 얻을 것은 :

<doc> 
    <int name="score">566</int> 
    <str name="text">SF - You lost me at hello...</str> 
</doc> 
<doc> 
    <int name="score">41</int> 
    <str name="text">hello</str> 
</doc> 
<doc> 
    <int name="score">77</int> 
    <str name="text"> 
    CAGE PAGE-SAY HELLO (MIKE GOLDEN's Life Is Bass Remix)-VIM 
    </str> 
</doc> 
<doc> 
    <int name="score">0</int> 
    <str name="text">Hello Hello Hello</str> 
</doc> 

점수가 566, 41, 77, 0 순서가 뒤떨어져 있음을 주목하십시오. 기이 한 점은 특정 쿼리에서이 방법 만 정렬한다는 것입니다. 나는 패턴이 무엇인지 모르겠지만, 지금까지는 "0"의 점수가 검색 결과로 돌아올 때만 잘못된 정렬을 볼 수있었습니다.

SortableIntField 대신 IntField를 시도했으며 쿼리 매개 변수로 "sort = score desc"를 사용하여 동작을 변경하지 않았습니다.

내가 뭔가 잘못하고 있거나 사용의 의미를 오해하고있는 것입니까 val : 검색어에 "score"가 있습니까?

편집 : "점수"필드의 이름을 "인기"로 변경하고 동일한 결과를 얻으려고했습니다.

답변

2

점수 필드는 내부적으로 Solr에서 사용되므로 같은 필드 이름을 가진 필드를 정의하는 것은 좋지 않을 수 있습니다.
다른 필드 이름으로 필드를 정의 해 볼 수 있으며 위에서 언급 한 두 옵션 모두 제대로 작동해야합니다.

편집 -이 (SOLR 3.3) 내가 무엇을하고 잘 작동

스키마 -

필드 형식 -

<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/> 

필드 -

<field name="popularity" type="int" indexed="true" stored="true" /> 

데이터 -

<add> 
    <doc> 
     <field name="id">1007WFP</field> 
     <field name="popularity">566</field> 
     <field name="text">SF - You lost me at hello...</field> 
    </doc> 
    <doc> 
     <field name="id">2007WFP</field> 
     <field name="popularity">41</field> 
     <field name="text">hello</field> 
    </doc> 
    <doc> 
     <field name="id">3007WFP</field> 
     <field name="popularity">77</field> 
     <field name="text"> 
     CAGE PAGE-SAY HELLO (MIKE GOLDEN's Life Is Bass Remix)-VIM 
     </field> 
    </doc> 
    <doc> 
     <field name="id">4007WFP</field> 
     <field name="popularity">0</field> 
     <field name="text">Hello Hello Hello</field> 
    </doc> 
</add> 

쿼리 -

http://localhost:8983/solr/select?q=*:*&sort=popularity%20desc 

결과 : -

<result name="response" numFound="4" start="0"> 
    <doc> 
    <str name="id">1007WFP</str> 
    <int name="popularity">566</int> 
    </doc> 

    <doc> 
    <str name="id">3007WFP</str> 
    <int name="popularity">77</int> 
    </doc> 
    <doc> 
    <str name="id">2007WFP</str> 
    <int name="popularity">41</int> 

    </doc> 
    <doc> 
    <str name="id">4007WFP</str> 
    <int name="popularity">0</int> 
    </doc> 
</result> 
+0

죄송하지만, 필드의 이름을 'popularity'로 변경하고 색인을 다시 작성하여 동일한 결과를 얻었습니다. – cwick

+0

또한 필드에 정렬을 허용하지 않으며 오류를 던질 수도있는 인덱싱 된 필드가 true로 표시되는 것을 보지 마십시오. – Jayendra

+0

나는 indexed = "true"및 indexed = "false"를 사용하여 시도했지만 아무런 효과가 없었다. 나는 indexed = "false"라는 에러 메시지를 얻지 못했다. – cwick

0

(가) 실제로 해킹 _val_는 SOLR의 일반적으로 계산 된 점수에 "인기"필드를 추가합니다.

따라서 문서 A에서 인기도 41이고 문서 B에서 인기도 77인데 문서 A는 키워드 "hello"에 대해 B보다 36 점이 더 뛰어났다면 A로 정렬됩니다. B.

스코어 별 일반 정렬을 완전히 무시하는 "정렬"필드를 사용하십시오 (이전처럼).

다른 방법으로는 필터 쿼리 (q 대신 매개 변수 fq)를 사용하여 점수를 계산하지 않고도 일치하는 문서를 필터링 한 다음 _val_을 사용하여 점수 계산 수식을 정의 할 수 있습니다. 필터 쿼리를 사용하면 검색된 모든 문서의 점수는 0이므로 _val_은 영향을받지 않고 원래 예상대로 작동합니다.

관련 문제