1

我正在使用 SOLR 在电子商务网站上进行搜索。

许多产品在描述中包含一个尺寸,使用 " 表示英寸,使用 ' 表示英尺。

所以我有两个问题:

  1. 我将使用什么分析器/标记器将其添加到索引中,以及
  2. 对 synonyms.txt (inch => " feet => ') 的简单添加会起作用吗?
4

1 回答 1

1

我遇到了同样的问题。我的偏好是使用,StandardTokenizer但它剥离了'and ",我找不到添加异常的方法。这意味着后分词器的同义词对于该任务将毫无用处。我搜索了另一个不会去掉引号和撇号但仍然对“标准”标记有用的标记器。我空空如也。

我最终采用的解决方案是charFilter在标记器之前使用 a 将"and更改'为其他更容易使用的东西。我用PatternReplaceCharFilter来实现这一点。

由于我StandardTokenizer在索引和查询上使用,我决定同时在两者上进行文本替换。就我而言,我想确保该值后面或前面有空格。您可以根据您的特定需求调整正则表达式。

我应该注意,我也确实设置了同义词(来自我之前的失败努力)。但是,我假设它们在这两个字符的情况下没有发挥作用,因为它们正在被转换为预分词器。

这也PatternCaptureGroupFilter有助于更好地索引诸如 1x1mm 或 2.5"x15" 之类的东西

分析仪

    <analyzer type="index">
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([\d\.]+)&quot;\s" replacement="$1 inch "/>
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([\d\.]+)&apos;\s" replacement="$1 feet "/>
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s([\d\.]+)&quot;" replacement=" $1 inch"/>
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s([\d\.]+)&apos;" 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&quot;&apos;]?)x[0-9\.]+)([a-z&quot;&apos;]?))\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\.]+)&quot;\s" replacement="$1 inch "/>
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([\d\.]+)&apos;\s" replacement="$1 feet "/>
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s([\d\.]+)&quot;" replacement=" $1 inch"/>
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s([\d\.]+)&apos;" 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
于 2015-10-08T08:36:36.227 回答