ドイツ語向けに solr.StrField のソート動作をカスタマイズする

トピック作成者:ks-solruserml-bot (2024/06/18 19:53 投稿)
6
CloseClose

(The bot translated the original post https://lists.apache.org/thread/k3zw6ptm2fn2sftl3psjgj78h7tqjxtz into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

こんにちは、

ドイツ語の家族名を含むドキュメントがあります。フィールドタイプは以下のように定義されています:

この家族名でソートすると、以下のような順序で結果が返ってきます:

昇順:

  1. Bart
  2. Otz
  3. Ozzbourne
  4. Zacharias
  5. bariton
  6. biene
  7. burtsch
  8. ozza
  9. Ádele
  10. Òle
  11. Ônna
  12. Ötz
  13. ägnie
  14. órthega

この順序は私にとって意外です。希望するソート順序は次の通りです:

  1. aäàâ-z(小文字)
  2. AÄÀÂ-Z(大文字)

つまり、小文字が大文字の前に来て、ウムラウトや特殊アクセントがその自然な文字の後に来るようにしたいです。

上記の例に対する完全なクエリは以下の通りです:

start=0
&rows=50
&fq=tenant_id:1
&fq=u_markedAsDeleted_b:false
&fq={!tag%3Du_cg_customergroup_0}(((u_customerGroupMemberships_customergroup_cp_ts_ns:(24))))
&fq=u_id_cp_s:[*+TO+*]&q=*:*
&facet=true
&facet.missing=true
&facet.sort=count
&facet.mincount=1
&sort=u_familyName_cp_s+asc,u_userName_cp_s+desc
&qf=u_userName_cp_s^20+u_displayName_cp_s^20++text^2+text_en+text_de+text_it
&pf=u_userName_cp_s^100+u_displayName_cp_s^20++text^10
&mm=100%25

どの部分のドキュメントを学んでカスタムソートを実現するかについての方向性を教えていただけますか?ありがとうございます。

よろしくお願いします。

Sebastian

返信投稿者:ks-solruserml-bot (2024/06/18 19:54 投稿)

Solr 8.10 を使っています。

返信投稿者:ks-solruserml-bot (2024/06/18 19:54 投稿)

こんにちは、

ドイツ語の解析チェーンオプションについては詳しくありませんが、インデックス時に CopyField を使用して、ウムラウトやその他の修飾子を取り除いた正規化されたテキストフィールドを作成することができるかもしれません。このようにすると、すべての種類の 'a' が単に 'a' になります。その後、このフィールドをソートに使用することができます。このフィールドを表示したり他の用途に使用する必要はありません。おそらく既に一部のフィールド名に 'cp' が含まれているようですので、CopyField には慣れていると思います。

よろしくお願いします。

Charlie

返信投稿者:ks-solruserml-bot (2024/06/18 19:54 投稿)

こんにちは、Sebastian、

これは自然なソート順序です。ASCIIテーブルを見てください。もし文字をきれいにまとめたい場合は、複雑なComparatorを作成するか、元の文字列値を解析されたテキストフィールドにCopyFieldして、KeywordTokenizerとASCIIFoldingFilterを設定します。

そのフィールドでソートし、ケースを扱うために元のフィールドで二次的なソートを行います。

よろしくお願いします。
Markus

返信投稿者:ks-solruserml-bot (2024/06/18 19:54 投稿)

個人的には使用したことはありませんが、細かな制御が必要であれば、ICUCollationFieldまたはCollationFieldを使用することを検討すると良いでしょう。以下のドキュメントに詳細が記載されています:
https://solr.apache.org/guide/8_10/language-analysis.html#sorting-text-with-custom-rules

また、ICUCollationFieldを使用してカスタムソート順序を実装する方法についての記事もあります:
https://dzone.com/articles/customize-sorting-order-with-rulebasedcollation-in

Andy

返信投稿者:ks-solruserml-bot (2024/06/18 19:54 投稿)

ICU Collation Fieldを使用することができます。以下はstringの代わりに使用する例です:

<fieldType name="sort" class="solr.ICUCollationField" locale="" numeric="true" strength="secondary" alternate="shifted" sortMissingLast="true" />

<dynamicField name="*_ans" type="sort" stored="false" /> <!-- ans = alpha-numeric sort -->

この設定では、数字や文字を正しくソートし、またUnicodeの折りたたみ(folding)を行います。つまり、1,2,3...10...20といった順序で並び替え、äやáなどの文字を"a"として扱います。

詳細はこちらのドキュメントをご覧ください:

https://solr.apache.org/guide/8_11/language-analysis.html#unicode-collation

返信投稿者:ks-solruserml-bot (2024/06/18 19:55 投稿)

私は、それがおそらくほとんどのプログラミング言語と同様にUTF-8の10進ソート順序で並べ替えていると仮定します。以下のリンクを参照してください:

https://www.w3schools.com/charsets/ref_utf_basic_latin.asp
https://www.w3schools.com/charsets/ref_utf_latin1_supplement.asp

Luceneインデックス内で処理を行いたい場合は、カスタムソートを持つ新しいフィールドを保存するか、カスタムソート関数を書く必要があると思います。

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2024 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?