弹性搜索:特定字段

时间:2016-08-19 06:12:04

标签: elasticsearch

我不熟悉弹性搜索并请求帮助。    基本上我的弹性搜索中有大约200万个文档,文档如下所示:

{
  "_index": "flipkart",
  "_type": "PSAD_ThirdParty",
  "_id": "430001_MAM_2016-02-04",
  "_version": 1,
  "_score": 1,
  "_source": {
    "metrics": [
      {
        "id": "Metric1",
        "value": 70
      },
      {
        "id": "Metric2",
        "value": 90
      },
      {
        "id": "Metric3",
        "value": 120
      }
    ],
    "primary": true,
    "ticketId": 1,
    "pliId": 206,
    "bookedNumbers": 15000,
    "ut": 1454567400000,
    "startDate": 1451629800000,
    "endDate": 1464589800000,
    "tz": "EST"
  }
}

我想写一个满足以下条件的聚合查询:

1)基于"_index""_type""pliId"的第一次查询。 2)根据metrics.id = "Metric1"对metrics.value进行汇总和。

基本上我需要根据某些字段查询记录,并根据指标ID对特定指标值进行汇总。 请帮我解决问题。

2 个答案:

答案 0 :(得分:1)

您的metrics字段必须是nested类型:

    "metrics": {
      "type": "nested",
      "properties": {
        "id": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }

如果您希望Metric1匹配,意味着大写字母,那么如上所示id需要not_analyzed

然后,如果您只想要metrics.id = "Metric1"聚合,则需要以下内容:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "pliId": 206
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "by_metrics": {
      "nested": {
        "path": "metrics"
      },
      "aggs": {
        "metric1_only": {
          "filter": {
            "bool": {
              "must": [
                {
                  "term": {
                    "metrics.id": {
                      "value": "Metric1"
                    }
                  }
                }
              ]
            }
          },
          "aggs": {
            "by_metric_id": {
              "terms": {
                "field": "metrics.id"
              },
              "aggs": {
                "total_delivery": {
                  "sum": {
                    "field": "metrics.value"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

创建新索引: 方法:PUT, 网址:http://localhost:9200/google/

体:

foreach (ListViewItem item in listview1.Items)
 {
   if (item.SubItems[0].Text == searchstr)
     {
       var Name = listview1.FindItemWithText(searchstr);

       if (Name != null)
        {
          var index = listview.Items.IndexOf(Name);
        }
     }

 }

然后我插入了大约20万个文档,然后运行查询并且它有效。

响应:

    {
      "mappings": {
        "PSAD_Primary": {
          "properties": {
            "metrics": {
              "type": "nested",
              "properties": {
            "id": {
              "type": "string",
              "index": "not_analyzed"
            },
            "value": {
              "type": "integer",
              "index": "not_analyzed"
            }
          }
            }
          }
        }
      }
    }