2017-01-22 123 views
0

我有一个与apachesolr搜索问题。Apache solr搜索问题

例如 ,我已经编入索引的内容是:

  • 提拉米苏D'HIVER
  • VeloutéD'HIVER
  • 通心粉D'HIVERcrémeux,
  • 冰沙版本HIVER

当我搜索“hiver”时,我只获得了冰沙版本hiver作为结果。

当我搜索dhiver,我得到的结果

  • 提拉米苏D'HIVER
  • VeloutéD'HIVER
  • 通心粉D'HIVERcrémeux

我需要得到所有结果我是否搜索hiver或dhiver或dhiver

任何人有一个想法是什么问题?我必须改变我的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分析工具是你的朋友。其次,请记住,如果查询和条件对于字符完全相同,则Solr只匹配100%字符。

对于下面的过滤器

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

VeloutéD'HIVER将被分析为

veloute | d'hiver | d | dhiver | hiver

所以会匹配您的查询hiver - 您可能想要删除| d |我的过滤器生成的令牌。

记得在某处放置重音字符。