3

製品 SKU のカスタム テキスト フィールド タイプを作成しています。

(ほんの一例) のような SKU がある場合ABC-DEF123G/5、ユーザーが句読点の有無にかかわらず検索できるようにしたいと考えています。多くの場合、関連するのは SKU の一部のみです (例:ABC-DEF123私の例)。

これまでのところ、私は次のようにschema.xml見えます:

<fieldType name="sku" class="solr.TextField" omitNorms="false">
    <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory"
            splitOnCaseChange="0"
            splitOnNumerics="0"
            stemEnglishPossessive="0"
            catenateAll="1"
        />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15"/>
    </analyzer>
</fieldType>

<!-- For use in Sunspot: -->
<dynamicField name="*_sku" stored="false" type="sku" multiValued="true" indexed="true"/>

これは、SKU の一部を検索して適切な結果を取得できるという点でうまく機能しますDEF123(ngram フィルターのおかげです)。ただし、句読点区切り記号なしで検索すると、一致するものが返されません。これはABC-DEF123G/5問題ありませんが、ABCDEF123G5そうではありません。

スキーマを分析すると、検索でABCDEF123G5一致が強調表示されていることがわかりますが、実際のクエリを実行すると結果が返されません。

Solr を再起動し、ドキュメントのインデックスを再作成しました。何度も。

SKU などのインデックス作成に関する知恵の真珠はありますか?


この編集者 ( aitchnyu ) は、ウィキペディアからこれを追加しました。

Stock-Keeping Unit (SKU) は、店舗やその他のビジネスで販売される商品やアイテムを一意に識別するために使用される番号またはコードです。

これは、購入できる個別の製品およびサービスごとに固有の識別子です。SKU の使用はデータ管理に根ざしており、会社は倉庫や小売店などで在庫や製品の入手可能性を体系的に追跡できます。多くの場合、マーチャント レベルで割り当てられ、シリアル化されます。各 SKU は、アイテム、バリアント、製品ライン、バンドル、サービス、料金、または添付ファイルに関連付けられています。SKU は、多くの場合、同じ製品の異なるバージョンを指すために使用されます。たとえば、Guitar Hero 3 というゲームを扱っている小売店には、3 つのプラットフォームごとに 2 つずつ、合計 6 つの SKU があり、1 つはギター コントローラー付きで、もう 1 つはギター コントローラーなしです。

4

2 に答える 2

4

これを定期的にいじって数日後、最終的に次のことに落ち着きました。

<fieldType name="sku" class="solr.TextField" omitNorms="false">
    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15"/>
    </analyzer>
</fieldType>

これは、同僚から提供された schema.xml のデフォルト バージョンから変更されました。

編集:

エッジ n グラムに変更し、n グラムの最小長を短くすることで、関連性がさらに向上しました。

<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>

于 2012-05-16T02:10:12.453 に答える
3

copyFieldと など、2 つの異なるフィールド タイプでa を使用できskuますsku_stripped

sku上記のようにフィールドを定義してから、次のように定義しsku_strippedますPatternReplaceFilterFactory

<fieldType name="sku_stripped" class="solr.TextField" omitNorms="false">
    <analyzer>
        <filter class="solr.PatternReplaceFilterFactory"
             pattern="[^A-Za-z0-9]"
             replacement=""
             replace="all"/>
        <!-- same as above ... -->
    </analyzer>
</fieldType>

次に、copyField:

<fields>
    <!-- ... -->
    <field name="stripped_sku_field" type="sku_stripped" 
        indexed="true" stored="false" multiValued="true" omitNorms="true"/>
    <!-- ... -->
</fields>
<copyField source="*_sku" dest="stripped_sku_field"/>
于 2012-05-07T09:51:45.683 に答える