5

我无法在我的 SOLR 搜索结果中检索带连字符的术语。例如,当我尝试搜索:superman、super man 等时,我应该在搜索结果中看到 super-man、super-man3 等标题。

字段类型如下:

<fieldType name="autocomplete_edge" class="solr.TextField">
    <analyzer type="index">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt" />
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="([\.,;:-_])" replacement=" " replace="all" />
        <filter class="solr.EdgeNGramFilterFactory" maxGramSize="30" minGramSize="1" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all" />
    </analyzer>
    <analyzer type="query">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt" />
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="([\.,;:-_])" replacement=" " replace="all" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="^(.{30})(.*)?" replacement="$1" replace="all" />
    </analyzer>
</fieldType> 

请帮忙。

问候

4

2 回答 2

3

我建议将WordDelimiterFilterFactory用于您的用例。

WordDelimiterFilterFactory 将允许您生成可以在特殊字符和数字上拆分的标记,并且还可以维护 Original 以便它与搜索词匹配。

例如
generateWordParts将转换super-man->super, man
splitOnNumerics将生成 super-man3 ->super, man, 3
catenateWords将转换super-man->superman
catenateAll将转换super-man3->superman3

因此,这将为您提供匹配相同单词组合的能力

于 2013-07-03T10:56:29.140 回答
0

假设您对连字符进行标记确定(请参阅下面答案中提到的 WordDelimiterFilterFactory),那么您的 solr 配置文件中的默认字段(df)或作为参数传递(&df=xxxx)是否与您正在标记的字段相同?

假设您的默认字段是:文本,您的索引字段是:名称

如果我们查询超人

name:super man

实际查询是:

parsedquery_toString: "+name:super +text:man"

哪个不匹配。如果您在引号中查询超人:

name:"super man"

它应该可以正常工作,但灵活性较差:

parsedquery_toString: "name:\"super man\"",

如果您将 df 设置为名称(例如匹配索引字段),它会给出:

parsedquery_toString: "+name:super +name:man"

也可以直接查询

name:super name:man

请注意,如果您使用的是 dismax,如果您仍然不匹配,则可能需要查看 mm 字段。

于 2016-03-24T16:44:58.937 回答