検索時にインデックスごとに返却するフィールドを分けたい

仮のインデックス構成となりますが、

  • index1のフィールド
    • name
    • title
  • index2のフィールド
    • name
    • title

という2つのインデックスが存在時に、

  • index1のname
  • index2のtitle

のみを検索結果として取得したい場合、実現方法はございますでしょうか?

イメージとしては、以下のようなものを考えているのですが、
_source_includeではインデックスの指定は出来ないため苦戦しております。

GET /_all/_search?_source_include=index1.name,index2.title 

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

ドキュメントを見る限りだと、出来ないようにも見えます...

過去、類似の発言もありましたが、回答がつかずにCloseになっていました。

例示なので実際には違うのでしょうけども、
index1のnameとindex2のnameが、違うものを指す、異なる内容のものだとすれば、
違うフィールド名にして取り扱うことで、_sourceで悩まなくても良いと思ったところです。

こんにちはー

要件と実現方法の話になってしまって申し訳ないですが、
とにかく1クエリで両方のデータを取ることだけが目的であれば、
普通にmsearchでindex毎にfields指定すればいいかなと思います。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html

@onorioriori
ちなみに、インデックスごとに個別のフィールドを取得したい理由と、実際のユースケース(使用するクライアントアプリ(ライブラリ?Kibana?そのほか?))などを教えてもらうことはできますでしょうか?

@tsgkdt
類似トピックのリンクありがとうございます。
はい、実際に考えているnameは同一のものを指しております。
index1_nameの様なフィールド名にする事も検討したのですが、
まず理想とする条件で実現する方法があるのかと思い、質問させて頂きました。

@r4-keisuke
お返事ありがとうございます。
msearchの検討もしたのですが、
2つのインデックス内のドキュメントを混在でソートを実施して表示したいため、
別々に取得するだけですと今回の要件に合いませんでした…

@johtani
お返事ありがとうございます。
個別フィールドを取得したい理由としては、APIのレスポンスとして、
不要なフィールド情報を含む検索結果からレスポンスを改めて成形するのではなく、
必要なフィールド情報のみを取得し、その情報をそのまま返したいと思ったためです。
index1とindex2には同じものを指すフィールドがあるものの、
一方のインデックスでは返却の必要性がない、といった状態です。
使用しているのは、pythonのクライアントになります。バージョンは6.3.0です。

Esだけの機能では無理だと思うので、クライアント側で何らかの処理を書いていただく形になるかと。
Pythonのクライアントは私はそれほど詳しくないですが、
返却された1件ごとのドキュメントに、_indexというデータがあるはずなので、クライアント側で、_indexの値を見ながら必要な項目だけ切り出すと言った感じでしょうか。

変わることはないとは思いますが、万が一、Esからのレスポンスのオブジェクトが変わった場合の影響範囲を考えると、オブジェクトの詰め替え(Esのレスポンスを元にクライアントアプリ側で使用するオブジェクトを生成する)を行っておくのがいいのではないかなぁと思う次第です。

ESの機能のみでは不可能の旨、承知しました。
仰る通り、各インデックス単位で、必要なインスタンス変数を持つクラスを作成しておき、
ESからのレスポンスに含まれる_indexの値によって、対応するクラスのオブジェクトを生成するのが良さそうですね。
実際に実装してみたところ、返却するフィールドをうまく切り分けることが出来ました。
ご回答ありがとうございました。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.