1

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

所有的 e 都消失了,例如 automobil 代替了汽车,montagn 代替了 montagne,styl 代替了 style ,homm => homme 等等。

<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:champpions&facet=true&facet.field=keywords

关键字内容:

<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>

字段定义:

如果有人对这个问题有任何想法......

感谢您的回答。问候杰罗姆·朗特

4

2 回答 2

4

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

您正在对标记化和过滤的字段进行分面,因此各个值是关键字字段中已处理的单词。

于 2012-10-02T21:29:56.527 回答
1

上面说的都是正确的,我只想添加一个方面。构面值是索引术语,而不是存储的术语。对构面的一项建议是使用字符串类型。这通常是一个不错的选择。但有时你想把一些事情以你的面子来说。在这种情况下,您可以使用文本类型,但只需轻视输入。在任何情况下都避免使用上述的 Stemming (SnowballPorter) 或 WordDelimiter 选择。

一个不错的选择是 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>

`

玩得开心 solr

奥利弗

于 2012-10-10T13:45:07.707 回答