我正在使用SOLR在电子商务网站上进行搜索。
许多产品在描述中都包含尺寸,使用“英寸符号”和“英尺符号”。
所以我有两个问题:
答案 0 :(得分:1)
我遇到了同样的问题。我的偏好是使用StandardTokenizer
,但它会删除'
和"
,但我找不到添加例外的方法。这意味着同义词(后标记化器)对于任务来说是无用的。我搜索了另一个不会删除引号和撇号的标记器,但仍然对#34;标准"符号化。我空了。
我最终使用的解决方案是在标记生成器之前使用charFilter
将"
和'
更改为更易于使用的其他内容。我使用PatternReplaceCharFilter
来实现这一目标。
由于我在索引和查询上使用StandardTokenizer
,我决定在两者上都进行此文本替换。在我的情况下,我想确保该值遵循或前面有空格。您可以根据您的特定需求调整正则表达式。
我应该注意到我也确实设置了同义词(来自我之前的失败的努力)。但是,我假设他们没有在这两个角色的情况下扮演角色,因为他们正在被转换为预标记器。
这也有一个PatternCaptureGroupFilter
来帮助更好地索引1x1mm或2.5" x15"
分析仪
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([\d\.]+)"\s" replacement="$1 inch "/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([\d\.]+)'\s" replacement="$1 feet "/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s([\d\.]+)"" replacement=" $1 inch"/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s([\d\.]+)'" replacement=" $1 feet"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
/>
<filter class="solr.PatternCaptureGroupFilterFactory" pattern=".*(([0-9\.]+([a-z"']?)x[0-9\.]+)([a-z"']?))\s*" preserve_original="true"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnNumerics="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" types="word-delim-special-chars.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([\d\.]+)"\s" replacement="$1 inch "/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([\d\.]+)'\s" replacement="$1 feet "/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s([\d\.]+)"" replacement=" $1 inch"/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s([\d\.]+)'" replacement=" $1 feet"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnNumerics="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" types="word-delim-special-chars.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
为了清晰和彻底,我包括以下内容,但我不相信他们在最终结果中起作用(与引用和撇号相关)。
字DELIM-特殊chars.txt
" => ALPHA
' => ALPHA
. => ALPHANUM
_ => ALPHA
synonyms.txt
",inch,inches,in.
feet,ft,',ft.,foot
oz,ounce,ounces,oz.
mm,millimeter,mm.,millimeters,mms
by,x
gram,g,grams
cm,centimeter,centimeters