Elasticsearch 嵌套排序 - 用于排序的文档和嵌套对象之间不匹配
Elasticsearch nested sort - mismatch between document and nested object used for sorting
我一直在开发一个新的搜索 API,使用 AWS Elasticsearch(版本 6.2)作为后端。
现在,我正尝试为 API 支持 "sort" 选项。
我的映射如下(不包括无关字段):
{
"properties": {
"id": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"description": {
"type": "text"
},
"materialDefinitionProperties": {
"type": "nested",
"properties": {
"id": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
},
"analyzer": "case_sensitive_analyzer"
},
"value" : {
"type": "nested",
"properties": {
"valueString": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
}
}
我试图让用户按 属性 值排序(路径:materialDefinitionProperties.value.valueLong.raw
)。
请注意,它位于 2 层嵌套对象中(materialDefinitionProperties 和 materialDefinitionProperties.value 是嵌套对象)。
要按照ID为"PART NUMBER"的属性的值对结果进行排序,我的排序要求是:
{
"fieldName": "materialDefinitionProperties.value.valueString.raw",
"nestedSort": {
"path": "materialDefinitionProperties",
"filter": {
"fieldName": "materialDefinitionProperties.id",
"value": "PART NUMBER",
"slop": 0,
"boost": 1
},
"nestedSort": {
"path": "materialDefinitionProperties.value"
}
},
"order": "ASC"
}
但是,当我检查响应时,"sort" 字段与文档的 属性 值不匹配:
{
"_index": "material-definition-index-v2",
"_type": "default",
"_id": "development_LITL4ZCNE",
"_source": {
"id": "LITL4ZCNE",
"description": [
"CPU, Intel, Cascade Lake, 8259CL, 24C, 210W, B1 Prod"
]
"materialDefinitionProperties": [
{
"id": "PART NUMBER",
"description": [],
"value": [
{
"valueString": "202-001193-001",
"isOriginal": true
}
]
}
]
},
"sort": [
"100-000018"
]
},
文件的零件号 属性 是“202-001193-001”,"sort" 字段显示“100-000018”,这是另一个文件的零件号。
似乎主文档和用于排序的嵌套对象不匹配。
当集群中只有少量文档时,此请求效果很好。但是一旦我用大约 100 万条记录回填集群,症状就会出现。我也试过创建一个新的 ES 集群,但结果是一样的。
按其他非嵌套属性排序效果很好。
是我误解了嵌套对象的概念,还是误用了嵌套排序功能?
任何想法表示赞赏!
这是 Elasticsearch 中的错误。升级到 6.4.0 解决了这个问题。
问题跟踪器:https://github.com/elastic/elasticsearch/pull/32204
发行说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/release-notes-6.4.0.html
我一直在开发一个新的搜索 API,使用 AWS Elasticsearch(版本 6.2)作为后端。
现在,我正尝试为 API 支持 "sort" 选项。
我的映射如下(不包括无关字段):
{
"properties": {
"id": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"description": {
"type": "text"
},
"materialDefinitionProperties": {
"type": "nested",
"properties": {
"id": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
},
"analyzer": "case_sensitive_analyzer"
},
"value" : {
"type": "nested",
"properties": {
"valueString": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
}
}
我试图让用户按 属性 值排序(路径:materialDefinitionProperties.value.valueLong.raw
)。
请注意,它位于 2 层嵌套对象中(materialDefinitionProperties 和 materialDefinitionProperties.value 是嵌套对象)。
要按照ID为"PART NUMBER"的属性的值对结果进行排序,我的排序要求是:
{
"fieldName": "materialDefinitionProperties.value.valueString.raw",
"nestedSort": {
"path": "materialDefinitionProperties",
"filter": {
"fieldName": "materialDefinitionProperties.id",
"value": "PART NUMBER",
"slop": 0,
"boost": 1
},
"nestedSort": {
"path": "materialDefinitionProperties.value"
}
},
"order": "ASC"
}
但是,当我检查响应时,"sort" 字段与文档的 属性 值不匹配:
{
"_index": "material-definition-index-v2",
"_type": "default",
"_id": "development_LITL4ZCNE",
"_source": {
"id": "LITL4ZCNE",
"description": [
"CPU, Intel, Cascade Lake, 8259CL, 24C, 210W, B1 Prod"
]
"materialDefinitionProperties": [
{
"id": "PART NUMBER",
"description": [],
"value": [
{
"valueString": "202-001193-001",
"isOriginal": true
}
]
}
]
},
"sort": [
"100-000018"
]
},
文件的零件号 属性 是“202-001193-001”,"sort" 字段显示“100-000018”,这是另一个文件的零件号。
似乎主文档和用于排序的嵌套对象不匹配。
当集群中只有少量文档时,此请求效果很好。但是一旦我用大约 100 万条记录回填集群,症状就会出现。我也试过创建一个新的 ES 集群,但结果是一样的。
按其他非嵌套属性排序效果很好。
是我误解了嵌套对象的概念,还是误用了嵌套排序功能?
任何想法表示赞赏!
这是 Elasticsearch 中的错误。升级到 6.4.0 解决了这个问题。
问题跟踪器:https://github.com/elastic/elasticsearch/pull/32204
发行说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/release-notes-6.4.0.html