gpt4 book ai didi

elasticsearch - 基于属性的索引提示会改变我的结果

转载 作者:行者123 更新时间:2023-12-02 22:51:18 26 4
gpt4 key购买 nike

自从我第一次使用该查询以来,我一直没有更改过它:

ISearchResponse<Series> response = await IndexManager.GetClient()
.SearchAsync<Series>(r => r
.Filter(f => f.Term<Role>(t => t.ReleasableTo.First(), Role.Visitor))
.SortDescending(ser => ser.EndDate)
.Size(1));

我的 IndexManager.GetClient()仅负责建立我与ElasticSearch的连接,并确保正确构建索引。其余代码获得了可向公众发布的最新文章系列。

IndexManager内部,我设置了显式索引映射,然后每次都从查询中获得结果。代码如下所示:
client.Map<Series>(m => m.Dynamic(DynamicMappingOption.Allow)
.DynamicTemplates(t => t
.Add(a => a.Name("releasableTo").Match("*releasableTo").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed))))
.Add(a => a.Name("id").Match("*id").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed))))
.Add(a => a.Name("services").Match("*amPm").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed)))
.Match("*dayOfWeek").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed))))
.Add(a => a.Name("urls").Match("*Url").MatchMappingType("string").Mapping(map => map.String(s => s.Index(FieldIndexOption.NotAnalyzed))))
));

尽管一切都很好,但是对于我们存储的每种类型都无法做到这一点。因此,我做出了一个明智的决定,即使用属性并以这种方式进行映射:
// In IndexManager
client.Map<T>(m => m.MapFromAttributes());

// In the type definition
class Series
{
// ....

[DataMember]
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed, Store = true)]
public HashSet<Role> ReleasableTo { get; set; }

// ....
}

一旦这样做,我将不再获得结果。当我在Kibana中查看索引时,看到未对“releasableTo”字段进行分析并且已对其进行索引。但是我写的查询不再起作用。如果删除filter子句,我会得到结果,但是我确实需要这样做。

我想念什么?如何使查询再次起作用?

最佳答案

似乎提供索引提示的ElasticSearch属性不知道如何处理enum

问题出在事实是Role类型是一个枚举。 client.Map<Series>(m => m.MapFromAttributes())调用跳过了该属性。在运行时,它将动态将属性映射到字符串。

// In the type definition
class Series
{
// ....

[DataMember]
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed, Store = true)]
public HashSet<Role> ReleasableTo { get; set; }

// ....
}

为了正确索引该字段,我必须在 ElasticProperty属性中明确设置其类型。将代码更改为此:
// In the type definition
class Series
{
// ....

[DataMember]
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed, Type = FieldType.String, Store = true)]
public HashSet<Role> ReleasableTo { get; set; }

// ....
}

使我的查询再次起作用。这个故事的寓意是,除非它是原始类型,否则在设置字段类型时必须明确。

关于elasticsearch - 基于属性的索引提示会改变我的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29194750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com