使用ElasticSearch 7.6,我想找到所有在区域列表中的点,还有一些其他的过滤标准,这些标准被添加到QueryContainerDescriptors列表中,并应用到最终的搜索中。
var queries = new List<Func<QueryContainerDescriptor<MySearchableObject>, QueryContainer>>();
这个例子适用于一个区域,其中Coordinates是一个字典。
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()))
)));
经过一番试错,这似乎解决了这个问题。
var areas = FindFilterAreas(query.Areas);
queries.Add(sqs => sqs.Bool(b => b.Should(MyQueries(b, areas))));
private static List<Func<QueryContainerDescriptor<SearchableSituation>, QueryContainer>> MyQueries(BoolQueryDescriptor<SearchableSituation> qd, IEnumerable<FilterArea> areas)
{
List<Func<QueryContainerDescriptor<SearchableSituation>, QueryContainer>> queries = new List<Func<QueryContainerDescriptor<SearchableSituation>, QueryContainer>> { };
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)));
}
return queries;
}