2017-01-22 3 views
0

apachesolr로 검색 문제가 있습니다.Apache solr 검색 문제

예를 를 들어 내가 색인 한 내용은 다음과 같습니다

  • 티라미수 디부 hiver
  • Velouté 디부 hiver
  • 에 minestrone 디부 hiver의 crémeux,
  • 스무디 버전 hiver

내가 "hiver"를 검색하면 스무디 버전 hiver 만 결과로 나타납니다. 내가 dhiver 검색 할 때 결과로

, 내가 얻을

  • Velouté 디부 hiver
  • 미네 스트로 네 디부 hiver 내가 모든 결과를 얻을 필요가

crémeux 티라미수 디부 hiver 하이버 또는 다이버 또는 다이버를 검색하는지 여부

어떤 것이 문제인지 알 수 있습니다. 내 schema.xml에서 뭔가를 변경해야합니까? 텍스트 필드에 대한

내 스키마는 다음과 같습니다

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="1" 
      splitOnNumerics="1" 
      preserveOriginal="1" 
    /> 
    <filter class="solr.LengthFilterFactory" min="3" max="100" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="5"/> 
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 

    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="0" 
      catenateAll="0" 
      splitOnCaseChange="1" 
      splitOnNumerics="1" 
    /> 
    <filter class="solr.LengthFilterFactory" min="3" max="100" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 

    </analyzer> 

    <analyzer type="multiterm"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      protected="protwords.txt" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="0" 
      catenateNumbers="0" 
      catenateAll="0" 
      splitOnCaseChange="1" 
      preserveOriginal="1"/> 
    <filter class="solr.LengthFilterFactory" min="2" max="100" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 

답변

1

흠 맛있는.

첫 번째 사항은 이러한 모든 종류의 문제에 대해 Solr Analysis 도구를 사용하는 것이 가장 좋은 방법입니다. 둘째, Solr은 쿼리와 용어가 동일한 문자의 100 % 문자 인 경우에만 일치한다는 것을 기억하십시오.

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" /> 

Velouté 디부 hiver이

veloute으로 분석됩니다 다음 필터

| d' hiver | d | 다이버 | hiver

그래서 hiver에 대한 쿼리와 일치합니다 - | d | 내 필터가 생성 한 토큰

악센트 부호를 너무 어딘가에 접으십시오.