3

全文検索にSolr3.6.0を使用しています。schema.xmlで次のフィールドを定義しています。

<field name="productNumber" type="ngramtext" indexed="true" stored="true" required="true" />  
<field name="additionalTextData" type="text_en" indexed="true" stored="true"/>  

次のフィールドタイプも定義しています。

<fieldType name="ngramtext" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

これにより、サイズ2および3のトークンが作成され、インデックスに配置されます。SKUの検索に最適です。今のところ、それらは同じインデックスにあり、これがパフォーマンスの問題を引き起こす可能性があることを私は知っています。しかし、パフォーマンスの問題が発生したときに対処することにしました。私が今持っているデータセットの場合、速度は素晴らしいです(主観的に言えば:))

私も次のものを持っています:

<uniqueKey>productNumber</uniqueKey>

solrconfig.xmlで、すべての「df」部分にadditionalTextDataを配置しました。

="df">="df">additionalTextData<

次のクエリを実行すると、次のようになります。

select?indent = on&version = 2.2&q = productNumber:12&fq =&start = 0&rows = 10000&fl = productNumber、additionalTextData&wt = json&explainOther&hl.fl

また

select?indent = on&version = 2.2&q = productNumber:12&fq = additionalTextData:*&start = 0&rows = 10000&fl = productNumber、additionalTextData&wt = json&explainOther&hl.fl

2345の結果が得られ、そのうちのいくつかが繰り返されます。productNumberで検索すると、2〜3回表示されます。なぜこれが起こるのですか?そして、どうすればこれを克服できますか?

編集1:
私はまた、追加することを知りました:

<filter class="solr.RemoveDuplicatesTokenFilterFactory" />

他のすべてのフィルターの後のngramtextfieldTypeでは、問題は解決しません。

mbonaciによるSOLUTION1:
代わりに:

<field name="productNumber" type="ngramtext" indexed="true" stored="true" required="true" />

場所:

<field name="productNumber" type="string" indexed="true" stored="true" required="true" />
<field name="productNumberCopyField" type="ngramtext" indexed="true" stored="true" required="true" />

fieldsタグの後に、次を追加します。

<copyField source="productNumber" dest="productNumberCopyField" />

そして、次のクエリを指定します。

select?indent = on&version = 2.2&q = productNumberCopyField:12&fq = additionalTextData:*&start = 0&rows = 10000&fl = productNumber、additionalTextData&wt = json&explainOther&hl.fl

4

1 に答える 1

2

そうです、インデックス アナライザーは ngram を作成しますが、Solr はその ngram を使用して一意のキーを形成します。それはあなたにとって意味がありますか?複数値の一意のキー?

たとえば、プロダクト キーを持っている場合tis876ati is s8 87 76 6a tis is8 s87 876 76a最終結果は次のようになります。それがすべての一意のキーです。

したがって、単純に type の copy-field を使用しlowercase(トークン化されておらず、小文字になっているだけです)、tis876aプロダクト キーとして使用します (もちろん、データ モデルで実際に一意のフィールドである場合)。

于 2012-06-11T11:16:57.700 に答える