solr 搜索带连字符的术语得到0个结果

x759pob2  于 2022-11-05  发布在  Solr
关注(0)|答案(2)|浏览(185)

我无法在SOLR搜索结果中检索带连字符的术语。例如,当我尝试执行以下搜索时:超人,超人等,我应该看到像超人,超人3等标题在我的搜索结果。
FieldType如下所示:

<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>
kd3sttzy

kd3sttzy1#

对于您的用例,我建议使用WordDelimiterFilterFactory。
WordDelimiterFilterFactory将允许您生成可以按特殊字符和数字拆分的标记,并且还可以维护Original以使其与搜索词匹配。
例如,
generateWordParts将转换为super-man-〉super, man
splitOnNumerics会产生超人3-〉super, man, 3
catenateWords将转换为super-man-〉superman
catenateAll将转换为super-man3-〉superman3
这样你就可以把相同单词的组合

vh0rcniy

vh0rcniy2#

假设你正在标记你的连字符ok(见下面答案中提到的WordDelimiterFilterFactory),那么你在solr配置文件中的默认字段(df)或作为参数传递的字段(&df=xxxx)是否与你正在标记的字段相同?
假设您的默认字段为:文本和索引字段为:姓名
如果我们查询超人

name:super man

实际的查询是:

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

如果您查询带引号的超人:

name:"super man"

它应该工作良好,但灵活性较差:

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

如果你把df设置为name(例如匹配索引字段),它给出:

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

也可以直接查询

name:super name:man

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

相关问题