我正在使用 SOLR 在电子商务网站上进行搜索。
许多产品在描述中包含一个尺寸,使用 " 表示英寸,使用 ' 表示英尺。
所以我有两个问题:
- 我将使用什么分析器/标记器将其添加到索引中,以及
- 对 synonyms.txt (inch => " feet => ') 的简单添加会起作用吗?
我正在使用 SOLR 在电子商务网站上进行搜索。
许多产品在描述中包含一个尺寸,使用 " 表示英寸,使用 ' 表示英尺。
所以我有两个问题:
我遇到了同样的问题。我的偏好是使用,StandardTokenizer
但它剥离了'
and "
,我找不到添加异常的方法。这意味着后分词器的同义词对于该任务将毫无用处。我搜索了另一个不会去掉引号和撇号但仍然对“标准”标记有用的标记器。我空空如也。
我最终采用的解决方案是charFilter
在标记器之前使用 a 将"
and更改'
为其他更容易使用的东西。我用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>
为了清晰和彻底,我将以下内容包括在内,但我认为它们不会在最终结果中发挥作用(与引用和撇号有关)。
word-delim-special-chars.txt
" => ALPHA
' => ALPHA
. => ALPHANUM
_ => ALPHA
同义词.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