有没有办法对 Azure Cognitive Search 中的嵌套 value 进行排序?
我的用例是我有一个歌曲数据库,这些歌曲与人们可以随着那首歌跳舞的舞蹈相关联。用户可以对歌曲的舞蹈是否适合跳舞进行投票,因此每个歌曲/舞蹈组合都有一个数字投票记录。搜索功能的核心部分是能够进行任意搜索并根据特定舞蹈的受欢迎程度对结果进行排序。
我目前正在通过为每个舞蹈创建一个带有修饰名称(例如 DNC_Salsa 或 DNC_Waltz)的新顶级字段来对此进行建模。这行得通。但除了笨拙之外,我无法将其他信息与舞蹈联系起来。此外,我必须动态添加舞蹈场,所以我必须使用 C# 库中的通用 SearchDocument 类型,而不是使用 POCO 类型。
我更喜欢将舞蹈字段建模为子文档数组,其中子文档包含舞蹈名称、投票计数和我想与舞蹈关联的其他信息。
简化的示例记录如下所示:
{
"title": "Baby, It's Cold Outside",
"artist": "Seth MacFarlane",
"tempo": 119.1,
"dances": [
{ "name", "cha cah", "votes", 1 },
{ "name", "foxtrot", "votes", 4 }
]
}
我试了一下并收到:
{"error":{"code":"OperationNotAllowed","message":"The request is invalid.","details":[{"code":"CannotEnableFieldForSorting","message":"The field 'Votes' cannot be enabled for sorting because it is directly or indirectly contained in a collection, which makes it a multi-valued field. Sorting is not allowed on multi-valued fields. Parameters: definition"}]}}
看起来弹性搜索会做我想要的:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/sort-search-results.html#_nested_sorting_examples
如果我正确阅读了 Elasticsearch 文档,您基本上可以说我想通过首先过滤 name == "cha cha" 然后对投票字段进行排序来对舞蹈子文档进行排序。
Azure Cognitive Search 中有这样的东西吗?甚至更严格的东西?我不需要对子文档中的任何内容进行任意排序。我很乐意只对投票计数进行排序(尽管我必须能够为任何舞蹈名称做到这一点)。
回答1
我不清楚您的记录或数据模型是什么样的。但是,从您提供的错误消息中,很明显您尝试对多值属性进行排序。这在逻辑上是不可能的。
想象一个属性 Color 可以包含像“红色”或“蓝色”这样的颜色。如果您按颜色排序,您会在蓝色之前获得红色 values。如果您的“颜色”可以包含多个 values,例如“红色”和“蓝色”,您将如何对其进行排序?你不能。
所以,如果你真的想按一个属性排序,这个属性必须包含一个value。
话虽如此,我感觉你真的在问排名/提升。不排序。查看针对不同音乐类型的提升和评分配置文件的示例。我相信这些示例中的用例可以帮助您解决用例。
https://docs.microsoft.com/en-us/azure/search/index-add-scoring-profiles#extended-example