Solr は copy-field に関して紛らわしいエラーメッセージを返します | KandaSearch Community Support Forum

Solr は copy-field に関して紛らわしいエラーメッセージを返します

トピック作成者:ks-solruserml-bot (2025/07/17 10:59 投稿)
6
OpenOpen

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

みなさん、こんにちは。

インデックスをクエリして、title_s_lower でソートしようとすると、HTTP エラー 400 が返されます:

{
  "error":{
    "metadata":["error-class","org.apache.solr.common.SolrException","root-error-class","org.apache.solr.common.SolrException"],
    "msg":"can not sort on a field w/o docValues unless it is indexed=true uninvertible=true and the type supports Uninversion: title_s_lower",
    "code":400
  }
}

私見ですが、このエラーメッセージは title_s_lowerindexed=true uninvertible=true もしくは docValues=true を追加するように求めているように思えますが、これは title_s_lower が copy-field であるため不可能です。

インデックス作成用の JSON データの抜粋:

{
  "add-field": [
    // 省略
    {
      "name": "title",
      "type": "text_general",
      "stored": true,
      "indexed": true,
      "multiValued": false,
      "required": true
    },
    // 省略
  ],
  "add-copy-field": [
    {
      "source": "title",
      "dest": "title_s_lower"
    }
  ]
  // 省略
}

どなたか、この問題の修正方法をご存じでしょうか?

Mag.phil. Robert Ehrenleitner, BEng.

返信投稿者:ks-solruserml-bot (2025/07/17 11:00 投稿)

私見ですが、このエラーメッセージは title_s_lowerindexed=true uninvertible=true または docValues=true を追加するように求めているように思えますが、それは copy-field なので不可能です。

とはどういう意味ですか?

copy-field も他のフィールドと同じで、値の元が別のフィールドから来ているだけです。
その属性(プロパティ)はあなたが自由に設定できますよ。

Alessandro Benedetti
名刺代わりのページ - https://sease.io/about/alessandro-benedetti
ブログ - https://sease.io/blog

返信投稿者:ks-solruserml-bot (2025/07/17 11:00 投稿)

つまり、私が言いたいのはこれです:

$ curl -o - -H 'Content-Type: application/json' --user "$solrCredentials" --data '{"add-copy-field":{"source":"title","dest":"title_str","indexed":true}}' "http://127.0.0.1:8983/solr/myschema/schema"

このようにリクエストを送ると、以下のようなレスポンスが返ってきます:

{
  "responseHeader": {
    "status": 400,
    "QTime": 0
  },
  "error": {
    "metadata": [
      "error-class",
      "org.apache.solr.api.ApiBag$ExceptionWithErrObject",
      "root-error-class",
      "org.apache.solr.api.ApiBag$ExceptionWithErrObject"
    ],
    "details": [{
      "errorMessages": [
        "add-copy-field 操作では 'source'、'dest'、'maxChars' パラメータのみが許可されています"
      ],
      "add-copy-field": {
        "source": "title",
        "dest": "title_str",
        "indexed": true
      }
    }],
    "msg": "コマンド処理中にエラーが発生しました。エラー内容: [{errorMessages=[add-copy-field 操作では 'source'、'dest'、'maxChars' パラメータのみが許可されています], add-copy-field={source=title, dest=title_str, indexed=true}}]",
    "code": 400
  }
}

Mag.phil. Robert Ehrenleitner, BEng.

返信投稿者:ks-solruserml-bot (2025/07/17 11:01 投稿)

copy field は、ソースフィールド A からターゲットフィールド B にデータをコピーするよう指示する「指令」にすぎません。つまり、「copy field」自体はフィールドではありません(「copy」は動詞として考えてください)。

ターゲットフィールドとソースフィールドは通常のフィールドであり、indexed=truedocValues=true など、さまざまな属性を持たせることができます。

したがって、「copy field」に対してソートやクエリを実行するのは論理的ではありません。なぜなら、それ自体はフィールドではないからです。クエリやソートができるのは、ソースフィールドおよびターゲットフィールドです。

— Ufuk

返信投稿者:ks-solruserml-bot (2025/07/17 11:01 投稿)

私自身の補足です:

次のような状況が判明しました:

  • 開発環境と本番環境で、同じテーブルを使用しています。
  • 開発環境では同じクエリがエラーを投げますが、本番環境では問題なく動作します。
  • 開発環境のインデックスのバージョンは 1.7、本番環境のインデックスのバージョンは 1.6 です。

そこで質問です:
この違いが影響する可能性はあるのでしょうか?

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

Mag.phil. Robert Ehrenleitner, BEng.

返信投稿者:ks-solruserml-bot (2025/07/17 11:01 投稿)

自分への回答です:

copy field に加えて、宛先フィールド(destination field)を JSON API の "add-field" で追加し、そのデフォルトの属性値を使わないようにする必要がありました。

なぜ他のスキーマではそれをせずに動作していたのかは不思議ですが、ともかく今はうまく動いています。

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

Mag.phil. Robert Ehrenleitner, BEng.

返信投稿者:ks-solruserml-bot (2025/07/17 11:02 投稿)

copy field に加えて、宛先フィールドを(JSON API の "add-field" を使って)追加し、デフォルトの属性値を与えないようにする必要がありました。
なぜ他のスキーマではそれをしなくても動いていたのか不思議ですが、ともかく今はうまくいっています。

それは…

開発環境では同じクエリがエラーを投げますが、本番環境では問題なく動作します。

  • 開発環境のインデックスのバージョンは 1.7、本番環境のインデックスのバージョンは 1.6

だからです。

そして、スキーマバージョン 1.7 と 1.6 の違いは以下の通りです:

https://solr.apache.org/guide/solr/latest/upgrade-notes/major-changes-in-solr-9.html#schemaversion-upgraded-to-1-7

デフォルトの schemaVersion は現在 1.7 です。新しいスキーマバージョンでは、
docValues をサポートするほとんどのフィールドや fieldType において、docValues がデフォルトで有効になります。
詳しくは「Enabling Doc Values」のセクションをご覧ください。

また、デフォルトではフィールドの uninvert(インバーテッドインデックスからの復元)はできなくなります。
(つまり uninvertible=false がデフォルト)

あなたはまだ、ソートしようとしていた title_s_lower フィールドの定義(明示的な定義でも、dynamicField による暗黙的な定義でも)と、その fieldType の定義を提示していません。

おそらくそのフィールドは TextField であり、スキーマバージョンが 1.6・1.7 のどちらでも docValues=false となっていると推測されます。そしてスキーマバージョン 1.6 の場合は uninvertible=true が暗黙的に設定されていたためにソート可能だったのでしょう。
一方で、スキーマバージョン 1.7 では uninvertible=false が暗黙的に設定されるため、ソートできなくなったのです。

— Hoss
http://www.lucidworks.com/

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

KandaSearch

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

投稿の削除

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