Проблема в гнезде запроса для сортировки в агрегации - PullRequest
0 голосов
/ 14 января 2019

Мне нужно получить запрос от Elasticsearch для последних зарегистрированных записей в указанной области в диапазоне указанных серийных номеров. по этой причине я сопоставил свой индекс в этой форме:

{ "settings": {
"index": {
  "number_of_shards": 5,
  "number_of_replicas": 2
}
},
"mapping": {
"AssetStatus": {
  "properties": {
    "serialnumber": {
      "type": "text",
      "fielddata": true
    },
    "vehiclestate": {
      "type": "text",
      "fielddata": true
    },
    "vehiclegeopoint": {
      "type": "geo-point",
      "fielddata": true
    },
    "vehiclespeed": {
      "type": "number",
      "fielddata": true
    },
    "vehiclefuelpercent": {
      "type": "text",
      "fielddata": true
    },
    "devicebatterypercent": {
      "type": "text",
      "fielddata": true
    },
    "networklatency": {
      "type": "text",
      "fielddata": true
    },
    "satellitescount": {
      "type": "number",
      "fielddata": true
    },
    "createdate": {
      "type": "date",
      "fielddata": true
    }
  }
}
}
}

и этот запрос работает правильно

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "serialnumber.keyword": "2228187d-b1a5-4e18-82bb-4d12438e0ec0"
          }
        },
        {
          "range": {
            "vehiclegeopoint.lat": {
              "gt": "31.287958",
              "lt": "31.295485"
            }
          }
        },
        {
          "range": {
            "vehiclegeopoint.lon": {
              "gt": "48.639844",
              "lt": "48.652032"
            }
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 0,
  "sort": [],
  "aggs": {
    "SerialNumberGroups": {
      "terms": {
        "field": "serialnumber.keyword"
      },
      "aggs": {
        "tops": {
          "top_hits": {
            "sort": [
              {
                "createdate.keyword": {
                  "order": "desc"
                }
              }
            ],
            "size": 1
          }
        }
      }
    }
  }
}

тогда как в моем запросе на гнездо есть эта ошибка

Неправильный ответ NEST, созданный из-за неудачного вызова низкого уровня на POST: / fms2 / AssetStatus / _search? Typed_keys = true

Журнал аудита этого вызова API:

  • [1] BadResponse: Узел: http://localhost:9200/ Взял: 00: 00: 00.1917118

    OriginalException: Elasticsearch.Net.ElasticsearchClientException: запрос не выполнен. Звоните: Код состояния 400 от: POST

/ fms2 / AssetStatus / _search? Typed_keys = верно. Ошибка сервера: Тип: parsing_exception Причина: "Неизвестный ключ для VALUE_STRING в [поле]."

Запрос:

принудительно установить его в ответе.>

Отклик:

ConnectionSettings, чтобы заставить его быть установленным в ответе.>

мой запрос на гнездо это

    var searchResponse =
        Client.Search<AssetStatus>(x => x
            .Index(settings.DefaultIndex)
            .Type("AssetStatus")
            .Query(fq => fq.GeoBoundingBox(c => c.Field(f => f.VehicleGeoPoint).BoundingBox(new GeoLocation(TopLeft.Lat, TopLeft.Lon), new GeoLocation(BottomRight.Lat, BottomRight.Lon))))
            .Query(fq =>
                fq.Bool(b => b.
                Filter(
                    f => f.Match(m => m.Field(g => g.SerialNumber.Suffix("keyword").Equals(sn)))
                )
            ))
            .Aggregations(a => a
                .Terms("group_by_SerialNumber", st => st
                    .Field(o => o.SerialNumber.Suffix("keyword"))
                    .Size(0)
                    .Aggregations(b=> b.TopHits("top_hits", lastRegistered => lastRegistered
                        .Field(bf=> bf.CreateDate.Suffix("keyword"))
                        .Size(1)))
                        ))
                        );

Эта проблема для сортировки в агрегации

1 Ответ

0 голосов
/ 14 января 2019

Проблема была в моем POCO, как вы можете видеть в моем запросе на гнездо, я использую прописные буквы для именования своих свойств. Я должен использовать библиотеку Nest для использования аннотации данных для POCO эластика.

[ElasticsearchType(Name = "AssetStatus")]
public class AssetStatus
{
    [Text]
    [PropertyName("serialnumber")]
    public string SerialNumber { get; set; }
    [Text]
    [PropertyName("vehiclestate")]
    public string VehicleState { get; set; }
    [GeoPoint]
    [PropertyName("vehiclegeopoint")]
    public GeoPoint VehicleGeoPoint { get; set; }
    [Number]
    [PropertyName("vehiclespeed")]
    public int VehicleSpeed { get; set; }
    [Text]
    [PropertyName("vehiclefuelpercent")]
    public string VehicleFuelPercent { get; set; }
    [Text]
    [PropertyName("devicebatterypercent")]
    public string DeviceBatteryPercent { get; set; }
    [Text]
    [PropertyName("networklatency")]
    public string NetworkLatency { get; set; }
    [Number]
    [PropertyName("satellitescount")]
    public byte SatellitesCount { get; set; }
    [Date]
    [PropertyName("createdate")]
    public string CreateDate { get; set; }
}
...