2011-08-20 1 views
2

표음과 일치하는 결과가 일반 검색보다 덜 가중되도록 색인을 설정하고 싶습니다.Sunspot (Solr)에서 다른 필드 유형의 다른 필드 색인 생성

이렇게하려면, 나는 텍스트 내의 schema.xml에서 두 개의 서로 다른 fieldType 세트를 만들었습니다

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ISOLatin1AccentFilterFactory"/> 
    <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/> 
    </analyzer> 
</fieldType> 
<fieldType name="text_phonetic" class="solr.TextField" omitNorms="false"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ISOLatin1AccentFilterFactory"/> 
    <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/> 
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/> 
    </analyzer> 
</fieldType> 

과 음성 공장에서 사용하는 dynamcicField 만들어 : 지금

<dynamicField name="*_phonetic" stored="false" type="text_phonetic" multiValued="true" indexed="true"/> 

을 내 모델은 다음과 같이 할 수 있습니다.

text :name, :as => :name_phonetic 

그리고 잘 작동합니다.

제 질문은 음성 텍스트와 함께 일반 텍스트 필드 색인을 사용하는 필드를 여러 개 설정하는 가장 좋은 방법은 무엇입니까? 내 모델의 모든 인덱싱 라인을 복제 할 수는 있지만 구성을 사용하여 스키마에서 직접이 작업을 수행 할 수있는 방법이 있으며 흑점 전체 텍스트 쿼리에서 사용할 수 있습니까?

답변

2

참고로 여러 가지 방법으로 색인을 생성하려는 입력란의 searchable 블록에 줄을 복제 할 수 있습니다. 당신이 실제로 필드의 세분화 된 정도를 유지하고 (아래에 보여짐), 인라인 :boost 옵션과 같은 멋진 Sunspot 헬퍼가 있기 때문에 실제로 이것을 권하고 싶습니다.

즉, 스키마에서 Solr의 copyField 지시문을 사용할 수도 있습니다. 그것은 다음과 같은 :

<copyField source="source_field" dest="dest_field" maxChars="N" /> 

소스 필드 이름이 패턴 일 수 있지만 목적지는 하나의 필드해야합니다. 또한 대상은 dynamicField과 일치하는 이름이 아니고 대상 field으로 정의되어야한다고 생각합니다.

이러한 제약은 당신은 당신의 스키마에 이런 식으로 뭔가를 설정할 수 있습니다 고려 :

<fields> 
    ... 
    <field name="all_text_phonetic" stored="false" type="text_phonetic" multiValued="true" indexed="true"/> 
    ... 
</fields> 

<copyField source="*_text" dest="all_text_phonetic" /> 
<copyField source="*_texts" dest="all_text_phonetic" /> 

은 각 입력 필드의 copyField 지침을 설정할 수 있습니다, 당신의 필드 단위를 유지하기 위해. 그렇다면 searchable 블록에 별도의 줄을 만드는 것과 관련하여 논란의 여지는 있지만 일 것입니다.

그래서 토스 윗입니다. 그러나 그것들은 당신의 선택입니다.

+0

좋아요, 실제로 이것은 가장 좋은 방법입니다. 의견 주셔서 감사합니다. – spike