27

大文字と小文字を区別しない形式で文字列フィールドのコピーを作成するにはどうすればよいですか? 典型的な「文字列」タイプと大文字と小文字を区別しないタイプを使用したい。タイプは次のように定義されます。

    <fieldType name="string" class="solr.StrField"
        sortMissingLast="true" omitNorms="true" />

    <!-- A Case insensitive version of string type  -->
    <fieldType name="string_ci" class="solr.StrField"
        sortMissingLast="true" omitNorms="true">
        <analyzer type="index">
            <tokenizer class="solr.KeywordTokenizerFactory"/>           
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
    </fieldType> 

そして、そのようなフィールドの例:

<field name="destANYStr" type="string" indexed="true" stored="true"
    multiValued="true" />
<!-- Case insensitive version -->
<field name="destANYStrCI" type="string_ci" indexed="true" stored="false" 
    multiValued="true" />

次のように CopyField を使用してみました。

<copyField source="destANYStr" dest="destANYStrCI" />

しかし、明らかに CopyField は、アナライザーが呼び出される前に source と dest で呼び出されるため、アナライザーを介して dest の大文字と小文字を区別しないように指定したにもかかわらず、ソース フィールドからコピーされた値の大文字と小文字は保持されます。

レコードの作成時に、クライアントからフィールドの値を再送信しないようにしたいと考えています。

4

2 に答える 2

54

SOからの回答がないため、SOLRユーザーリストをフォローアップしました。copyFieldの効果を考慮しても、string_ciフィールドが期待どおりに機能していないことがわかりました。Ahmet Arslanは、「string_ci」フィールドでsolr.StrFieldではなくsolr.TextFieldを使用する必要がある理由を説明しています。

apache-solr-1.4.0 \ example \ solr \ conf \ schema.xmlから:

「StrFieldタイプは分析されませんが、逐語的に索引付け/保存されます。」

「solr.TextFieldを使用すると、トークナイザーとして指定されたカスタムテキストアナラ​​イザーとトークンフィルターのリストを指定できます。」

彼が提供した例と私自身によるわずかな調整で、次のフィールド定義がうまくいくように見え、今ではCopyFieldも期待どおりに機能します。

    <fieldType name="string_ci" class="solr.TextField"
        sortMissingLast="true" omitNorms="true">
        <analyzer>
            <tokenizer class="solr.KeywordTokenizerFactory"/>           
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
    </fieldType> 

destANYStrCIフィールドには大文字と小文字が区別された値が格納されますが、大文字と小文字を区別しないフィールドで検索できます。警告:ワイルドカードフレーズはクエリアナライザをバイパスし、インデックスと照合する前に小文字にされないため、大文字と小文字を区別しないワイルドカード検索は実行できません。これは、ワイルドカードフレーズの文字が一致するためには小文字でなければならないことを意味します。

于 2010-01-13T23:00:14.903 に答える