1

我正在使用 EdgeNGramFilterFactory 实现 solr 通配符搜索。我正在尝试实现前/后搜索。例如搜索“格式系统”和“系统格式”以返回相同的结果。我已经为正面和背面配置了 EdgeNGramFilterFactory,但只有前面的“”格式系统“搜索不起作用,而不是“系统格式”。你能建议我在这里错过了什么或其他什么问题吗?

这是我的配置

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
            <analyzer>
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.LowerCaseFilterFactory" />
                <filter class="solr.StopFilterFactory" words="stopwords_en.txt" ignoreCase="true" />
                <!-- <filter class="solr.SnowballPorterFilterFactory" language="English" /> -->
                <filter class="EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
                <filter class="EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="back" />
            </analyzer>
</fieldType>
4

1 回答 1

2

您提到的示例不太适合,因为它包含术语,并且当您搜索术语时,您不需要任何通配符。如果您想搜索术语部分,例如 sys,则制作 NGrams 看起来是个好主意。我建议你看看你的 solr 分析页面,看看你的分析器链的结果。

EdgeNGramFilterFactory配置为side="front",将单词系统作为输入将产生以下术语:

sy sys syst syste system

通过这种方式,您可以搜索 sys 或 syste 并获得结果,即使您最初索引的术语是 system。

EdgeNGramFilterFactory配置为side="back",将单词系统作为输入将产生以下术语:

em tem stem ystem system

这样您就可以搜索 tem 或 ystem 并获得结果。

如果将它们放在同一个链中,则第二个分析器会处理第一个分析器生成的每个术语。您基本上是从每个前面的 NGram 中制作回 NGram,我猜这不是您想要的。

最好先澄清您的要求。如果您仍想前后生成 NGram,您应该在两个不同的字段中执行此操作,然后您可以使用edismax解析器搜索这两个字段。

于 2012-06-21T07:00:16.607 回答