【解決済】親のプロパティ値を子検索時に付与する方法について

下記のような親子関係にあるタイプで、子(articles)一覧を検索時に親(blog)の category 情報を一緒に取得する方法はありますでしょうか?

# 親
{
  "blog": {
    "properties": {
      "blog_id": {
        "type": "long",
        "index": "not_analyzed"
      },
      "category": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
},
# 子
{
  "articles": {
    "_parent": {
      "type": "blog"
    },
    "properties": {
      "articles_id": {
        "type": "long",
        "index": "not_analyzed"
      },
      "subject": {
        "type": "string",
        "index": "not_analyzed"
      },
      "body": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
}

blogとarticlesは1対多の関係にあります。
category は高頻度で変更されることが想定されているため、愚直にarticles内に入れるとその都度関連のarticlesも更新する必要が出てくるためよりよい方法がないか、ご教示いただけると幸いです。

Inner hitsだとどうでしょうか?
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-inner-hits.html

手元の環境 elasticsearch/kibana 5.4.1で以下のように試したところ、親の内容も結果に含んでいました。

以下、こちらで再現した手順と内容です。

親・子関係を持つ定義を作成

PUT forum0707
{
  "mappings": {
    "blog": {
      "properties": {
        "blog_id": {
          "type": "long"
        },
        "category": {
          "type": "keyword"
        }
      }
    },
    "articles": {
      "_parent": {
        "type": "blog"
      },
      "properties": {
        "articles_id": {
          "type": "long"
        },
        "subject": {
          "type": "keyword"
        },
        "body": {
          "type": "text"
          
        }
      }
    }
  }
}

テストデータの作成

POST forum0707/blog/1
{
  "blog_id": 1,
  "category": "政治"
}
POST forum0707/blog/2
{
  "blog_id": 2,
  "category": "エンタメ"
}

POST forum0707/articles/1?parent=1
{
  "articles_id": 1,
  "subject": "東京都議会選挙のはなし",
  "body": "7月にありました。 test"
}
POST forum0707/articles/2?parent=1
{
  "articles_id": 2,
  "subject": "Hello World",
  "body": "Hello World。 hoge"
}
POST forum0707/articles/3?parent=1
{
  "articles_id": 3,
  "subject": "こんにちわせかい",
  "body": "はじめまして。 test"
}

POST forum0707/articles/3?parent=2
{
  "articles_id": 4,
  "subject": "たまには",
  "body": "娯楽の記事でも。 test"
}

検索

親にblogを持ち、bodyに「test」を含むarticlesを探す。Inner Hitでblogの内容も出す。

GET forum0707/articles/_search
{
  
  "query": {
    "bool": {
      "must": [
        {
          "has_parent": {
            "parent_type": "blog",
            "query": {
              "match_all": {}
            },
            "inner_hits" : {}
          }
        },
        {
          "match_phrase": {
            "body": "test"
          }
        }
      ]
    } 
  }

}

結果(一部抜粋)

blog:1の政治カテゴリが取得できていることが確認できました。

{
  "took": 27,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1.4475205,
    "hits": [
      {
        "_index": "forum0707",
        "_type": "articles",
        "_id": "3",
        "_score": 1.4475205,
        "_routing": "1",
        "_parent": "1",
        "_source": {
          "articles_id": 3,
          "subject": "こんにちわせかい",
          "body": "はじめまして。 test"
        },
        "inner_hits": {
          "blog": {
            "hits": {
              "total": 1,
              "max_score": 1,
              "hits": [
                {
                  "_type": "blog",
                  "_id": "1",
                  "_score": 1,
                  "_source": {
                    "blog_id": 1,
                    "category": "政治"
                  }
                }
              ]
            }
          }
        }
      },

手元の環境でInner histsを検証してみたところ、要件を満たせることがわかりました、完璧でした!

本当にありがとうございます!
今後ともどうぞよろしくお願いいたします。

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