2016-07-12 2 views
0

저는 Solr과 협력 중이며 EdgeNGramFilterFactory의 작동 방식을 알고 싶습니다.Solr nGram 필터 minGramSize - 단어 2 자만의 토큰

예를 들어, "1 tb"라는 용어를 찾고 있습니다. 내가 검색하는 필드에 대한 속성이있는 제품이 거의 없습니다.

다음은이 필드 유형에 대해 색인 시간에 적용된 필터입니다.

<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="10" /> 

이제 "1 tb"라는 용어를 검색 할 때 원하는 결과를 얻지 못합니다.

"5 메가 픽셀"이라는 용어가있는 제품이 거의없고 "5 메가"를 검색하면 결과가 나옵니다. 나중에 나는 그것이 "5 나"를 위해 작동하지 않는다는 것을 발견했다. 그리고 결과를주지 않습니다.

nGram 필터를 제거하면 정상적으로 작동합니다. 또한 minGramSize = "1"로 설정하면 쿼리 "1 tb"가 올바르게 작동합니다.

나는 용어 ​​tb에 대해 토큰 tb가 유효해야한다고 가정했습니다. 하지만 minGramSize를 2로 적용하면 생성되지 않는 것 같습니다!

누군가 설명 할 수 있습니까?

다음은 스키마에 정의 된 필드입니다.

<fieldType name="AttributesField" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="10" /> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
    </fieldType> 
+0

당신이 SOLR 관리 페이지에서 동일한 분석 않은 다음과 같은 용어로 분류됩니다? 필드에 사용 된 정확한 fieldType은 무엇입니까? –

+0

별도의 필터 및 토큰 라이저가 필요한 텍스트 필드 유형을 만들었습니다. – Krunal

+0

동일하게 설명 할 수 있습니까? 그게 다 뭐야? –

답변

0

당신은 fieldType

아래
<fieldType name="AttributesField" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="10" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 

PorterStemFilterFactory으로 시도 할 수는 단어에서 일반적인 엔딩을 제거 정규화 과정을 수행합니다. 문자열 값 Nigerian 아래의 구성으로

Example: "riding", "rides", "horses" ==> "ride", "ride", "hors". 

<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 

Nigerian => "ni", "nig", "nige", "niger", "nigeri", "nigeria", "nigeria", "nigerian" 
+0

질문에 추가했습니다. 동일한 결과가 나타났습니다. 어떤 토큰이 만들어 졌는지 어떻게 확인할 수 있습니까? – Krunal

+0

solr 분석 페이지에서 동일하게 확인하십시오. 쿼리시에 생성 된 토큰 및 쿼리시 전송 된 토큰이 표시됩니다. –

+0

http : // hostname : 8983/solr/.......... ... https : //cwiki.apache.org/confluence/display/solr/Query+Screen –