検索結果のソートのカスタマイズ

FESS 14.3.0とElasticsearch 8.3.3を利用しています
データストアでデータをCSVから読み込み、スクリプトでフィールドを追加しています
fess_config.propertiesのquery.additional.search.fields等に設定し、
追加フィールドを検索結果として表示できることを確認しましたが、
追加フィールドをソートオプションに追加し、検索したところ下記例外が発生しています

追加フィールド名=hoge
OpenSearchStatusException[OpenSearch exception [type=search_phase_execution_exception, reason=all shards failed]]; nested: OpenSearchException[OpenSearch exception [type=illegal_argument_exception, reason=Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [hoge] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]]; nested: OpenSearchException[OpenSearch exception [type=illegal_argument_exception, reason=Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [hoge] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]];
at org.opensearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:202)
at org.codelibs.fesen.client.action.HttpAction.toOpenSearchException(HttpAction.java:138)
at org.codelibs.fesen.client.action.HttpSearchAction.lambda$execute$0(HttpSearchAction.java:48)
at org.codelibs.curl.CurlRequest.lambda$execute$4(CurlRequest.java:238)
at org.codelibs.curl.CurlRequest.lambda$connect$3(CurlRequest.java:209)
at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Suppressed: OpenSearchException[hits is null.]
… 9 more

この例外の内容はhogeをkeyword型とする、または、fielddata=trueとする必要があると認識していますが、
この追加フィールドhogeをkeyword型とするにはどうしたらよいでしょうか?
現在の設定方法ではデータストアのスクリプトに「hoge=cell1」と記述しており、
ダッシュボードのrestからREQUESTで確認すると下記のような設定になっています。
“hoge”: {
“type”: “text”,
“fields”: {
“keyword”: {
“type”: “keyword”,
“ignore_above”: 256
}
}

参考にフォーラム内で検索したところ下記トピックが近い内容で、
特に一番上のトピックはエラー内容のkeyward型を利用するというものと同じであるかと思いますが、
型の変更についてどのようにすればよいか分かりませんでした

よろしくお願いいたします

query.additional.search.fields に、具体的にどう設定したかでしょうか。

meta:creationDate=creation_date:pdf_date\n\
CreationDate=creation_date:pdf_date\n\
Creation-Date=creation_date:date\n\

このような感じで、date 型の作成日を追加して、ソートできています。

"creation_date": { -
   "type": "date"
},

データを入れる前にupdate mapping apiでフィールドの型を登録してください。登録しないでデータを登録すると、自動で判定されて、そんな感じのtext型でマルチフィールドで登録されます。一度登録したものは型の変更ができません。

ありがとうございます。
update mapping apiで新規フィールドを登録し、そのフィールドでソートを実装することができました。

query.additional.search.fieldsには

query.additional.search.fields=hoge

という設定をしていました

教えていただいた設定を生かすことはできませんでしたが、
update mapping apiで新規項目(hoge2)のtype設定後、

query.additional.sort.fields=hoge2

と設定することでソートできるようになりました
ありがとうございます

1 Like