5

ElasticSearch を少し使ってみたところ、集計を行うときに問題が見つかりました。

/A/Bの2 つのエンドポイントがあります。最初のものには、2番目のものの両親がいます。したがって、B 内の 1 つまたは複数のオブジェクトは、A 内の 1 つのオブジェクトに属している必要があります。したがって、B 内のオブジェクトには、ElasticSearch によって生成された親インデックスを持つ属性「parentId」があります。

A の親を B の子属性でフィルター処理したいと考えています。そのためには、まず B の子を属性でフィルター処理し、後で親を取得するために使用する固有の親 ID を取得します。

このリクエストを送信します。

POST http://localhost:9200/test/B/_search
{
    "query": {
        "query_string": {
            "default_field": "name",
            "query": "derp2*"
        }
    },
    "aggregations": {
        "ids": {
            "terms": {
                "field": "parentId"
            }
        }
    }
}

そして、次の応答を取得します。

{
  "took": 91,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "test",
        "_type": "child",
        "_id": "AU_fjH5u40Hx1Kh6rfQG",
        "_score": 1,
        "_source": {
          "parentId": "AU_ffvwM40Hx1Kh6rfQA",
          "name": "derp2child2"
        }
      },
      {
        "_index": "test",
        "_type": "child",
        "_id": "AU_fjD_U40Hx1Kh6rfQF",
        "_score": 1,
        "_source": {
          "parentId": "AU_ffvwM40Hx1Kh6rfQA",
          "name": "derp2child1"
        }
      },
      {
        "_index": "test",
        "_type": "child",
        "_id": "AU_fjKqf40Hx1Kh6rfQH",
        "_score": 1,
        "_source": {
          "parentId": "AU_ffvwM40Hx1Kh6rfQA",
          "name": "derp2child3"
        }
      }
    ]
  },
  "aggregations": {
    "ids": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "au_ffvwm40hx1kh6rfqa",
          "doc_count": 3
        }
      ]
    }
  }
}

何らかの理由で、フィルタリングされたキーが小文字で返されるため、ElasticSearch に親を要求できません

GET http://localhost:9200/test/A/au_ffvwm40hx1kh6rfqa

Response:
{
  "_index": "test",
  "_type": "A",
  "_id": "au_ffvwm40hx1kh6rfqa",
  "found": false
}

なぜこれが起こっているのかについてのアイデアはありますか?

4

2 に答える 2

5

集計のヒットと結果の違いは、作成された用語に対して集計が機能することです。彼らはまた条件を返します。ヒットは元のソースを返します。

これらの用語はどのように作成されますか? あなたの場合はデフォルトの標準アナライザーである、選択したアナライザーに基づいています。このアナライザーが行うことの 1 つは、用語のすべての文字を小文字にすることです。アンドレイが述べたように、フィールドparentIdをnot_analyzedに設定する必要があります。

PUT test
{
  "mappings": {
    "B": {
      "properties": {
        "parentId": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }   
}
于 2015-09-18T10:58:54.263 に答える