【问题标题】:Solr SnowballPorterFilterFactory for index and query analyzersSolr SnowballPorterFilterFactory 用于索引和查询分析器
【发布时间】:2012-05-15 20:40:54
【问题描述】:

我将 SnowballPorterFilterFactory 用于索引和查询分析器。 当我搜索“专业”这个词时。 Solr 成功只找到包含“专业”的文章,但我想要“专业”“专业”...

这是 schema.xml

上的当前配置
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1"/>
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.SnowballPorterFilterFactory" language="French"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>

    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.SnowballPorterFilterFactory" language="French"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    </analyzer>
</fieldType>

【问题讨论】:

  • 我建议转到 Solr 管理面板,单击 Analysis 并对此类型进行现场分析。同时执行查询和索引,看看它们是否以相同的方式被提取。
  • 同时查看 Solr 日志,看看 Porter 过滤器工厂是否被正确加载,尤其是使用额外的语言标签或者它是否抛出了某种警告。

标签: search solr snowball snowballanalyzer


【解决方案1】:

正在发生的事情是搬运工过度提取了您的查询。当您搜索profession 时,您的关键字将被归结为profess,而profession professionalprofessionalism 都以profession 的形式存储在索引中。

您要解决此问题的唯一真正方法是添加另一个fieldType,您不会阻止查询。

类似:

<fieldType name="text_unstemmed_query" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1"/>
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.SnowballPorterFilterFactory" language="French"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    </analyzer>
</fieldType>

使用如下复制字段:

&lt;copyField source="your_text_field" dest="text_unstem_query_field"/&gt;

【讨论】:

  • 我不认为这是问题所在 - 我自己使用 Porter 词干提取器,而且我以前从未遇到过这种双词干问题。
  • 我通过 Solr 分析运行了他的设置,这就是我得到的结果。在索引中,Profession 被归结为 professprofessional 被归结为 profession。它们与他当前的设置不匹配。这就是为什么有一种分析器类型,一种用于在索引中存储内容,另一种用于在运行查询时进行比较。
  • 嗨,感谢您的回复,我验证了我的日志并使用了 copyfield 解决方案,但问题仍然存在,请注意我使用的是 edismax 查询解析器。我应该在我的 q 参数上添加 * 吗?示例:职业*
  • 如果他不阻止查询,它就不会匹配他在索引中的内容。然而,一个(肮脏的)解决方法是两次阻止所有内容。这样一来,一切都将成为基础。
  • 词干没有问题,但问题是词干与*标记结合。所以专业词的词根是 profess,当我在 prefess 之后添加 * 标记时,他们找不到带有 profess* => 专业,专业...的文章。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
相关资源
最近更新 更多