電子商取引サイトでの検索に SOLR を使用しています。
多くの製品には、説明に寸法が含まれており、インチは "、フィートは ' の表記が使用されています。
だから私は2つの質問があります:
- それをインデックスに追加するには、どのアナライザー/トークナイザーを使用しますか?
- synonyms.txt (inch => " feet => ') への単純な追加は機能しますか?
電子商取引サイトでの検索に SOLR を使用しています。
多くの製品には、説明に寸法が含まれており、インチは "、フィートは ' の表記が使用されています。
だから私は2つの質問があります:
私は同じ問題に遭遇しました。私の好みは を使用することでしStandardTokenizer
たが、'
andが削除"
され、例外を追加する方法が見つかりませんでした。これは、トークン化後のシノニムがこのタスクには役に立たないことを意味していました。引用符とアポストロフィを取り除かないが、「標準」のトークン化に役立つ別のトークナイザーを探しました。私は空っぽになりました。
charFilter
私が最終的に行った解決策は、トークナイザーの前にa を使用して、 "
andを操作'
しやすい別のものに変更することでした。これを達成するために を使用しPatternReplaceCharFilter
ました。
インデックスとクエリで を使用しているためStandardTokenizer
、このテキスト置換も両方で行うことにしました。私の場合、値の前後に空白があることを確認したかったのです。特定のニーズに合わせて正規表現を調整できます。
同義語も設定されていることに注意してください(以前の失敗した努力から)。ただし、これら 2 つの文字はトークン化前に変換されているため、これらの 2 つの文字の場合は役割を果たしていないと想定しています。
これには、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
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