使用现场报价搜索/索引SOLR文档

时间:2012-08-21 19:05:02

标签: solr

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

许多产品在描述中都包含尺寸,使用“英寸符号”和“英尺符号”。

所以我有两个问题:

  1. 我将使用什么分析器/标记器将其添加到索引和
  2. 对synonyms.txt(inch =>“feet =>”)的简单补充会有效吗?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。我的偏好是使用StandardTokenizer,但它会删除'",但我找不到添加例外的方法。这意味着同义词(后标记化器)对于任务来说是无用的。我搜索了另一个不会删除引号和撇号的标记器,但仍然对#34;标准"符号化。我空了。

我最终使用的解决方案是在标记生成器之前使用charFilter"'更改为更易于使用的其他内容。我使用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>

为了清晰和彻底,我包括以下内容,但我不相信他们在最终结果中起作用(与引用和撇号相关)。

字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