Solr:搜索带连字符的术语给出0结果

时间:2013-07-02 12:40:41

标签: solr hyphen

我无法在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> 

请帮忙。

此致

2 个答案:

答案 0 :(得分:2)

我建议您使用WordDelimiterFilterFactory作为用例。

WordDelimiterFilterFactory允许您生成可以分割为特殊字符和数字的标记,并保留原始标记以使其与搜索项匹配。

例如
generateWordParts会转换super-man - &gt; super, man
splitOnNumerics会生成超级man3 - &gt; super, man, 3
catenateWords会转换super-man - &gt; superman
catenateAll会转换super-man3 - &gt; superman3

因此,这将使您能够匹配相同单词的组合

答案 1 :(得分:0)

假设您正在将连字符标记为ok(请参阅下面的答案中提到的WordDelimiterFilterFactory),那么您的solr配置文件中的默认字段(df)或作为参数传递(&amp; df = xxxx)与字段相同你在表示吗?

说你的默认字段是:text 您的索引字段是:name

如果我们查询超人

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字段,如果仍然不匹配。