【问题标题】:New synonyms aren't being used未使用新的同义词
【发布时间】:2013-09-13 15:40:22
【问题描述】:

我在获取新的同义词以使用 SOLR 时遇到了一些困难。奇怪的是,分发版附带的 sysnonyms.txt 文件中的示例条目可以正常工作。我添加的任何新内容都没有。

例如,synonyms.txt 有以下示例:

GB、gib、千兆字节、千兆字节

然后我使用上述术语之一查询字段调用“主题”。

主题:中国

主题:gib

等等……

无论我在查询中使用哪些术语,我都会得到与预期相同的结果集。

接下来,我在 synonyms.txt 中添加了以下行:

ibm, i.b.m., 国际商务机器

我确保在 schema.xml 中,字段类型 text_general(字段“主题”使用的字段类型)为索引启用了 SynonymFilterFactory,如下所示:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

最后,由于我的数据在 mysql 数据库中,然后我使用 dataimport 重新导入了所有数据,假设这是我需要做的重新索引。

但是,虽然查询 subject:ibm" 会返回多个结果,但查询 "subject:i.b.m." 不会返回任何结果。

我做错了什么?

【问题讨论】:

  • 好的,我对自己的问题有部分答案。该查询似乎与“i.b.m.”中的“句号”有问题。作为测试,我添加了另一个与 ibm 相关的相关词“bbbbb”,并且有效。现在我只需要弄清楚如何让带有句点的首字母缩写词起作用。有什么建议吗?

标签: solr


【解决方案1】:

好的,我相信我已经弄明白了,现在它似乎按我的预期工作了。

我用 ClassicTokenizerFactory 替换了 StandardTokenizerFactory,并将 ClassicFilterFactory 添加到链中。最终结果是我最终得到了去掉句点的标记,这似乎有效。

所以,这是我对 text_general 的更新定义:

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.ClassicTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ClassicFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.ClassicTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ClassicFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    </analyzer>
</fieldType>

【讨论】:

  • 您有任何参考资料,或者您能解释一下您是如何得出这个解决方案的吗?
【解决方案2】:

您需要让同义词过滤器知道使用什么分词器对输入文本进行分词:

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <!--- ... -->
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.StandardTokenizerFactory"/>
    <!--- ... -->
  </analyzer>
</fieldType>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多