Solr查询/字段分析器

7

我是Solr的入门新手,在查询结果中遇到了不想要的字符问题。例如,当我搜索“foo bar”时,结果中出现了“'foo' bar”等内容。我只想要精确匹配。据我所知,这可以在schema.xml文件中设置。

我的内容字段类型:

<fieldtype name="textNoStem" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <filter class="solr.LowerCaseFilterFactory" />
        <tokenizer class="solr.KeywordTokenizerFactory" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldtype>

如果您知道解决方案,请告诉我。 此致敬礼。


澄清一下,“foo bar”不应该匹配“‘foo’ bar”,因为foo被单引号包围,“foo bar”也不应该匹配“foo”,因为它缺少“bar”。这是你的意思吗? - an phu
3个回答

14
对于这两个分析器,第一行应该是标记器。标记器用于将文本拆分为更小的单元(通常是单词)。根据您的需求,WhitespaceTokenizerFactory可能是正确的选择。
如果您想要绝对精确匹配,那么在标记器之后不需要任何过滤器。但是,如果您不希望搜索区分大小写,您需要添加LowerCaseFilterFactory
请注意,您有两个分析器:一个是“索引”类型,另一个是“查询”类型。正如名称所示,第一个用于索引内容,而另一个用于查询。一个几乎总是好的规则是为两个分析器使用相同的标记器/过滤器集合。

我建议在进行分词之前使用PatternReplaceCharFilterFactory来删除单引号字符。 - an phu
也许如果查询分析器除了索引分析器的所有内容之外,还有一个额外的同义词过滤器会更好? - WoLfPwNeR

0

我猜你没有得到任何结果,因为已经索引的数据在分词方面有所不同。

正如Pascal所说,whitespaceTokenizer是你的正确选择。在索引和查询时都使用它,并在索引一些数据后检查结果,而不是在先前索引的数据上。

我建议使用分析页面查看结果,而不实际进行索引。这非常有用。在模式中进行更改,刷新核心,转到分析页面并查看详细输出以获得逐步分析。


0

如果您只想要精确匹配,请在查询时使用KeywordTokenizerFactory而不是StandardTokenizerFactory。


感谢您的快速回答。但是,当我使用KeywordTokenizerFactory时,对于像“foo bar”这样的查询,我根本没有得到任何结果。我尝试在查询分析器中添加<filter class="solr.StandardFilterFactory"/>,但仍然没有变化。我已经想不出更多的想法了... - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接