提问者:小点点

solr切面搜索截断词


为法语内容配置一个solr。搜索很好,但是当我激活facet搜索时,单词会以特殊方式被截断。

所有这些都消失了,例如汽车而不是汽车,蒙塔尼而不是蒙塔尼,风格而不是风格,homm=

<lst name="keywords">
    <int name="automobil">1</int>
    <int name="citroen">1</int>
    <int name="minist">0</int>
    <int name="polit">0</int>
    <int name="pric">0</int>
    <int name="shinawatr">0</int>
    <int name="thailand">0</int>
</lst

这是查询q=fulltextfield: Champpion

关键字内容:

<arr name="keywords">
    <str>Ski</str>
    <str>sport</str>
    <str>Free style</str>
    <str>automobile</str>
    <str>Rallye</str>
    <str>Citroen</str>
    <str>montagne</str>
</arr>

这是使用的架构:

<fieldtype name="text_fr" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_fr.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" />
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="French"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_fr.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" />
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="French"/>
  </analyzer>
</fieldtype>

字段def:

如果有人对这个问题有想法……

谢谢你的回答。问候杰罗姆·朗格


共2个答案

匿名用户

通常,如果要将字段用作facet,则应将其存储为字符串。

您正在标记和过滤字段上刻面,因此各个值是关键字字段中处理过的单词。

匿名用户

以上所说的都是正确的,我只想在一个方面添加一件事。方面的值是索引的术语,而不是存储的术语。对于方面的一个建议是使用字符串类型。这通常是一个不错的选择。但是有时你想对你的方面术语做一些事情。在这种情况下,你可以使用文本类型,但只能轻描淡写地对待输入。在任何情况下,都要避免使用上述的Stemming(雪球搬运工)或WordD的选择。

从KeywordTokenizerFactory开始是一个不错的选择,您可以使用PatternReplace来清理您的术语和输入,并在最后执行TrimFilter。如果您的用户要看到条款,请不要进行低端缩写。

一个例子,我的输入是字母语言代码。PatternReplace清理非字母字符,第二次纠正输入错误:

`

  <analyzer>
     <tokenizer class="solr.KeywordTokenizerFactory" />
     <filter class="solr.LowerCaseFilterFactory" />
     <filter class="solr.PatternReplaceFilterFactory"
             pattern="([^a-z])" 
             replacement="" 
             replace="all" />
     <filter class="solr.PatternReplaceFilterFactory"
             pattern="fer|xxx"
             replacement="und"
             replace="all" />
     <filter class="solr.LengthFilterFactory" min="3" max="3" />
  </analyzer>

`

和索尔玩得开心

奥利弗