2017-05-31 49 views
3

这是我的理解,如果您在搜索文档中有一个枚举,它将被转换为一个int。除非我做错了什么,否则这似乎并没有发生,我可以通过将枚举转换为字符串来实现这一点。这似乎是错误的。有人可以告诉我,如果我做错了什么,或者这是不可能的?在Azure搜索文档中使用枚举

例子:

public enum WebSearchRecordType{ 
    Unknown = 0, 
    Doc1 = 1, 
    Doc2 = 2 
} 

public class WebSearchDocument{ 
    public Guid Id {get;set;} 
    public WebSearchRecordType RecordType { get; set; } 
} 

如果我使用类似上面的,而试图创建索引,我收到以下错误:

Message: "Property recordType has unsupported type Web.Search.WebSearchRecordType\r\nParameter name: propertyType"

+0

对,我意识到我的例子很糟糕,所以我会在一分钟内复制一些代码。 –

+0

您使用的是什么版本的Microsoft.Azure.Search软件包?另外,你可以分享你用来创建索引的代码吗? –

+0

欢迎回到我疯狂的生活@BruceJohnston :) –

回答

0

Azure的搜索不支持枚举类型的字段类型。相反,您需要自己映射枚举和其中一种受支持的数据类型(int或string,具体取决于您希望标签还是基础值存储在索引中)。实现这一点的一种方法是用[JsonIgnore]标记你的枚举属性,然后实现所需字段类型的第二个属性,并在它与getter/setter中的枚举之间映射。请注意,您可以控制属性名称如何映射到具有[JsonProperty("...")]属性的索引字段。

此外,您的模型类使用Guid作为关键字段的类型。这也不被支持。您可以使用相同的技术将您自己的Guid属性映射到实际映射到相应索引字段的字符串属性。

+0

1)我知道Guids不支持,我们正在将它们转换为字符串 2)我尝试了你的第一个建议,将枚举设置为[JsonIgnore],然后有另一个属性读取字符串/ int,但是当它尝试从Azure Search SDK中的方法构建索引时(我将不得不再次回购它以便将其提供给您),这会引发异常 3)最后,我只是将属性更改为一个字符串,并写了一个扩展方法将其转换回来。 4)我的问题是,虽然Azure Search可能不支持枚举,但人们会认为默认情况下可以将其转换为int。 –

+0

目前还不清楚int是否是正确的默认值。为什么不串?如果在枚举的中间添加新标签,其他标签的值可能会发生变化,而如果仅将标签用作字符串,则不会更改。您必须小心才能获得持久性合同,否则您可能会在稍后遇到一些令人讨厌的兼容性问题。 如果您想继续关于SDK如何支持枚举的讨论,请随时在这里创建一个问题,并以“Search SDK:”开头的说明 - https://github.com/azure/azure-sdk- for-net/issues –

+0

你有一个非常有效的关于默认枚举到int的观点。我承认这不会是支持枚举的理想方式。我将提出一个关于我所说的问题,即在索引创建期间JsonIgnore /属性失败。 –