0

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

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

GB,gib,千兆字节,千兆字节

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

主题:gb

主题:gib

ETC...

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

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

ibm, ibm, 国际商务机器

我确保在 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:ibm”的查询不会返回任何结果。

我究竟做错了什么?

4

2 回答 2

0

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

我用 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>
于 2013-09-16T14:45:40.300 回答
0

您需要让同义词过滤器知道用于标记输入文本的标记器:

<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>
于 2014-08-11T11:01:41.083 回答