0

ElasticSearch 7.6 を使用して、エリアのリスト内にあるすべてのポイントを検索したいと考えています。QueryContainerDescriptors のリストに追加され、最終的な検索に適用されるフィルター基準が他にもいくつかあります。

 var queries = new List<Func<QueryContainerDescriptor<MySearchableObject>, QueryContainer>>();

この例は、Coordinates がディクショナリである 1 つの領域で機能します。

foreach (var area in areas)
{
    var pointsList = area.Coordinates.Values.Select(p => new GeoLocation(p.Latitude, p.Longitude)).ToList();

    queries.Add(sqs => sqs
        .GeoPolygon(r => r
            .Field(f => f.Position)
            .ValidationMethod(GeoValidationMethod.Strict)
            .Points(pointsList)));
}

そしてこれも:

queries.Add(sqs => sqs.Bool(b=>b.Should(bs => GeoPolygonShouldQuery(bs, area))));

private static QueryContainer GeoPolygonShouldQuery(QueryContainerDescriptor<MySearchableObject> bs, FilterArea area)
{
     return bs
    .GeoPolygon(r => r
        .Field(f => f.Position)
        .ValidationMethod(GeoValidationMethod.Strict)
        .Points(area.Coordinates.Values.Select(p => new GeoLocation(p.Latitude, p.Longitude))));
}

リスト内の各領域に should 句を追加するにはどうすればよいでしょうか?

これに似ています:

queries.Add(sqs => sqs.Bool(b => b.Should(
                bs => bs.GeoPolygon(r => r.Field(f => f.Position)
                    .Points(areas.ElementAt(0).Coordinates.Values.Select(p => new GeoLocation(p.Latitude, p.Longitude)).ToList())),
                bs => bs.GeoPolygon(r => r.Field(f => f.Position)
                    .Points(areas.ElementAt(1).Coordinates.Values.Select(p => new GeoLocation(p.Latitude, p.Longitude)).ToList()))
                )));
4

1 に答える 1