Solr ngram 不匹配具有特殊字符的术语
Solr ngram does not match the terms with special chars
参考这个 blog 我添加了新的 Solr 字段类型 "text_suggest_ngram" 到 schema.xml 如下。
<fieldType name="text_suggest_ngram" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory"
mapping="mapping-ISOLatin1Accent.txt" />
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1"
catenateWords="0" catenateNumbers="0"
catenateAll="0" splitOnCaseChange="1" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory"
maxGramSize="20" 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.StandardTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="0" generateNumberParts="0"
catenateWords="0" catenateNumbers="0"
catenateAll="0" splitOnCaseChange="0" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory"
pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all" />
<filter class="solr.PatternReplaceFilterFactory"
pattern="^(.{20})(.*)?" replacement="" replace="all" />
</analyzer>
下面是 solrconfig.xml
的 suggestngram 请求处理程序
<requestHandler name="/suggestngram" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<str name="defType">edismax</str>
<str name="rows">10</str>
<str name="fl">myterm</str>
<str name="qf">term_suggest^30 term_suggest_ngram^50.0</str>
<str name="pf">term_suggest_edge^50.0</str>
<str name="group.field">term_suggest_ngram</str>
<str name="sort">count desc, term_suggest_ngram asc</str>
<str name="group.sort">count desc</str>
</lst>
</requestHandler>
这适用于所有情况,除非我寻找具有特殊字符的术语,例如 "Cars & bikes" 或 "car.bike" 它会忽略特殊字符并显示不相关的结果。如果我搜索 rock/roll,它会显示 rock roll、rockers、rolldown 等。
我也试过把 / 放在特殊字符之前。
<filter class="solr.PatternReplaceFilterFactory"
pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all" />
这将删除大部分不常见的字符。所以,这可能是你的问题。尝试将其注释掉,看看你得到了什么。
但一般来说,您可以查看 Web Admin UI 的分析屏幕,了解文本如何通过每个单独的过滤器以及在何处变成您不希望的内容。您甚至可以在另一侧输入查询文本,看看它是否会按预期匹配。强烈推荐,特别是如果你只是复制定义而没有完全深入理解它的作用。
参考这个 blog 我添加了新的 Solr 字段类型 "text_suggest_ngram" 到 schema.xml 如下。
<fieldType name="text_suggest_ngram" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory"
mapping="mapping-ISOLatin1Accent.txt" />
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1"
catenateWords="0" catenateNumbers="0"
catenateAll="0" splitOnCaseChange="1" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory"
maxGramSize="20" 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.StandardTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="0" generateNumberParts="0"
catenateWords="0" catenateNumbers="0"
catenateAll="0" splitOnCaseChange="0" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory"
pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all" />
<filter class="solr.PatternReplaceFilterFactory"
pattern="^(.{20})(.*)?" replacement="" replace="all" />
</analyzer>
下面是 solrconfig.xml
的 suggestngram 请求处理程序<requestHandler name="/suggestngram" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<str name="defType">edismax</str>
<str name="rows">10</str>
<str name="fl">myterm</str>
<str name="qf">term_suggest^30 term_suggest_ngram^50.0</str>
<str name="pf">term_suggest_edge^50.0</str>
<str name="group.field">term_suggest_ngram</str>
<str name="sort">count desc, term_suggest_ngram asc</str>
<str name="group.sort">count desc</str>
</lst>
</requestHandler>
这适用于所有情况,除非我寻找具有特殊字符的术语,例如 "Cars & bikes" 或 "car.bike" 它会忽略特殊字符并显示不相关的结果。如果我搜索 rock/roll,它会显示 rock roll、rockers、rolldown 等。 我也试过把 / 放在特殊字符之前。
<filter class="solr.PatternReplaceFilterFactory"
pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all" />
这将删除大部分不常见的字符。所以,这可能是你的问题。尝试将其注释掉,看看你得到了什么。
但一般来说,您可以查看 Web Admin UI 的分析屏幕,了解文本如何通过每个单独的过滤器以及在何处变成您不希望的内容。您甚至可以在另一侧输入查询文本,看看它是否会按预期匹配。强烈推荐,特别是如果你只是复制定义而没有完全深入理解它的作用。