2010-08-05 7 views
7

내가 할 수있는 일은 쿼리를 수행하고 대/소문자를 구분하지 않고 인덱스의 부분 단어와 일치하는 결과를 다시 얻는 것입니다.Solr에서 다중 토큰 화 도구 사용하기

수정 된 순간에 Solr 스키마를 설정 했으므로 결과에 상관없이 결과를 쿼리하고 반환 할 수 있습니다. 그래서, iPOd를 검색하면 돌아온 iPod을 볼 수 있습니다. 이 작업을 수행하는 코드는 다음과 같습니다 나는 우리가 일부 단어 매치 쿼리를 수행 할 수 있도록이 코드를 발견,하지만 난 하나 개의 필드에 두 tokenizers을 가질 수 있다고 생각하지 않습니다

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
... 
</fieldType> 

.

<fieldType name="text" class="solr.TextField" > 
    <analyzer type="index"> 
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
... 
</fieldType> 

필드에서이 토크 나이저를 수행하려면 어떻게해야합니까?
또는 병합 할 수있는 방법이 있습니까?
아니면이 작업을 수행 할 수있는 또 다른 방법이 있습니까?

답변

7

NGram 토크 나이저가있는 다른 fieldType (즉, 다른 이름)을 선언 한 다음 NGram과 함께 fieldType을 사용하는 필드를 선언하고 표준 "text"fieldType을 사용하여 다른 필드를 선언하십시오. copyField를 사용하여 서로 복사하십시오. Indexing same data in multiple fields을 참조하십시오.

+1

을하지만, 두 토큰 화기로 토큰 화 된 데이터에서 결과가 어떻게 보이는지 쿼리하는 방법은 무엇입니까? 즉, 한 번에 두 토크 메이커에서 결과를 얻는 방법은 무엇입니까? –

7

대체 방법으로 EdgeGramFilterFacgtory를 기존 필드에 적용하고 현재 토큰 화기 (WhitespaceTokenizerFactory)를 유지하는 것입니다.

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 

이 변경되지 않은 현재의 스키마를 유지하는 것, 그런 다음 아래 같은 다른 토크 나이 (NGramTokenizerFactory)

귀하의 필드의 모양이 추가 필드 필요가없는 것, 즉 :

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
... 
</fieldType>