7

私はこのようなドキュメントを持っています(ここに2つの例があります):

{
    "id": 1234,
    "title": "the title",
    "body": "the body",
    "examples": [
        {
            "evidence_source": "friend",
            "source_score": 15
        },
        {
            "evidence_source": "parent",
            "source_score": 12
        }
    ]
}

{
    "id": 6346,
    "title": "new title",
    "body": "lots of content",
    "examples": [
        {
            "evidence_source": "friend",
            "source_score": 10
        },
        {
            "evidence_source": "parent",
            "source_score": 27
        },
        {
            "evidence_source": "child",
            "source_score": 4
        }
    ]
}

配列内のサブドキュメントの形式にexamplesは常にevidence_sourcesource_scoreがありますが、これらのサブドキュメントの量は可変であり、それぞれ値が異なりevidence_sourceます。

source_score特定の値に一致する値の1つに基づいて、この形式のドキュメントを並べ替えることができるかどうか疑問に思っていevidence_sourceます。私は本当にこれができるようになりたいです:

  • source_score関連する場所を降順に並べ替えevidence_sourceますfriend。結果として得られるドキュメントidの順序は1234,6346になります。
  • source_score関連する場所を降順に並べ替えevidence_sourceますparent。結果として得られるドキュメントの順序は、id6346,1234になります。

このようなことをするために私が思いついた最も近い結果は12ですが、私がやりたいことを正確に達成できるとは思いません。

私がこれについてどうやって行くのかについてのアイデアはありますか?これらのサブドキュメントに個別にインデックスを付けることに基づいていくつかのアイデアを検討しましたexamplesが、elasticsearchはかなり新しいので、最も簡単な方法で目標を達成する方法についてアドバイスを探しています(これは夢のようなものかもしれません)。 ...)

更新elasticsearchメーリングリストへの投稿は、これが不可能であることを示しているようですが、ここにいる他の誰かが別のアイデアを持っているかどうか疑問に思っています!

4

1 に答える 1

19

ネストされたドキュメント内のフィールドに基づく並べ替えのサポートが0.90でelasticsearchに追加されました。

https://github.com/elasticsearch/elasticsearch/issues/2662

ネストされたフィールドによる並べ替えのサポートには、既存の並べ替えオプションに加えて、次のパラメーターがあります。

  • nested_path-並べ替えるネストされたオブジェクトを定義します。実際のソートフィールドは、このネストされたオブジェクト内の直接フィールドである必要があります。デフォルトでは、ソートフィールドから最も直接継承されたネストされたオブジェクトが使用されます。
  • nested_filter-ネストされたパス内の内部オブジェクトが一致するフィルターは、そのフィールド値が並べ替えによって考慮されるために必要です。一般的なケースは、ネストされたフィルターまたはクエリ内でクエリ/フィルターを繰り返すことです。デフォルトでは、nonested_filter はアクティブです。

サンプルデータを考えると、次のクエリで目的のデータが得られるはずです。

{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "examples.source_score": {
        "order": "desc",
        "nested_path": "examples",
        "nested_filter": {
          "term": {
            "examples.evidence_source": "friend"
          }
        }
      }
    }
  ]
}
于 2013-05-23T13:59:47.783 に答える