2012-12-14 4 views
4

sunspot_rails을 사용하여 Solr 인스턴스에 쿼리를 제출합니다. 모든 것은 정상적으로 작동하지만 다음과 같은 기준으로 결과를 주문하고 싶습니다. 일치하는 단어가 단어의 일부가 아닌 단어로 나타나는 문서를 먼저 갖고 싶습니다.Solr에서 sunspot_rails로 검색하는 동안 부분 단어 일치보다 전체 단어 일치를 어떻게 높일 수 있습니까?

따라서, 나는 두 개의 문서가있는 경우 :

1) SOLR으로 검색 SOLR은 환상적이다

2) SOLR 무료 텍스트 검색을 지원하기 위해 매우 좋은

내가 찾는 용어는 다음과 같습니다. search,

결과에서 두 문서를 모두 가져오고 싶습니다.하지만 나는 문서를 원합니다. ent (2)가 먼저 나타납니다.

나는 order_by :score, :desc을 시도했지만 작동하지 않는 것 같습니다. "점수"가 계산되는 방법을 알 수있는 방법을 찾지 않는 한. 사전 Panayotis

+0

태양 흑점과 함께 작동하는지 모르겠지만 lucene의 쿼리 구문은 정확한 검색을 위해'search ~ 1'을 검색 할 수 있습니다. 그것 이외에, 나는 당신이 형태소 분석을 방지하기 위해 solr 필터/토크 나이저를 혼란시켜야한다고 생각합니다. 그러나 나는 어떻게 확신 할 수 없습니다. –

+1

solr을 사용할 수있는 해결책은 흑점 용으로 수정해야합니다. http://stackoverflow.com/questions/2630879/solr-exact-word-search. Sunspot의 wiki에서는 필터/토큰 화자를 사용하는 방법을 설명합니다. https://github.com/sunspot/sunspot/wiki/Advanced-Fulltext-Search-Configuration –

답변

3

에서

덕분에 당신은 SOLR 두 개의 필드를 유지해야합니다.
원래 값과 다른 하나는 분석 된 값을 가진 것입니다. text_org and text (which is analyzed)
그런 다음 부스트를 적절히 조정하여 분석 된 필드 값보다 원래 필드 값을 높일 수 있습니다. text_org^2 text^1
원본과 일치하는 경우 분석 된 텍스트와 일치하거나 정확히 일치하는 전체 단어 일치 효과가 일반 일치보다 많음을 기억하십시오.

1

Jayendra의 답변을 약간 확장하면 두 개의 별도 입력란에 색인을 생성해야합니다. 여기

내 대답에서 이전 질문에, 태양 흑점에 대한 예시의 schema.xml 발췌입니다 :

searchable do 

    text :title 
    text :title, :as => :title_ngram 

    # ... 

end 
: How to boost longer ngrams in solr?searchable 블록에서

<schema> 
    <types> 

    <!-- 
     A text type with minimal text processing, for the greatest semantic 
     value in a term match. Boost this field heavily. 
    --> 
    <fieldType name="text" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.StandardFilterFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 

    <!-- 
     Looser matches with NGram processing for substrings of terms and synonyms 
    --> 
    <fieldType name="text_ngram" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.StandardFilterFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" /> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="6" side="front" /> 
     </analyzer> 
    </fieldType> 

    <!-- other stuff --> 

    </types> 
    <fields> 

    <!-- other fields; refer to *_text --> 

    <dynamicField name="*_ngram" type="text_ngram" ... /> 

    </fields> 
</schema> 

, 당신은 필드 이름을 지정합니다 :as 옵션을 사용할 수 있습니다

+0

schema.xml에서 비슷한 설정을했습니다. 'text : title_ngram, : as as => : title_ngram do : title end'을 사용했지만 결과는 0 점입니다. 어떤 아이디어, 문제가 될 수 있습니까? 정말 좋은 도움이 될 것입니다. –

관련 문제