我有一个ElasticSearch索引,其中的文档如下所示:
{
"labels": ["Common label for doc 1", "Other possible label"],
"year": 1923,
"boolProp": true
},
{
"labels": ["Only one label here"],
"year": 1812,
"boolProp": true
},
...
当我在labels
字段上查询时,我想检索最佳文档以及匹配标签。
我已经读过这个字段实际上被索引为一个单独的聚合字符串......
我是否必须将labels
字段转换为此类查询的嵌套对象?我想知道我有一个更直接的方法我错过了......
答案 0 :(得分:0)
一种方法是使用Highlighting。
这是一个相当丰富的功能,但以下示例可帮助您实现目标。
{
"query": {
"match": {
"myfield": "another"
}
},
"highlight": {
"fields": {
"myfield": {
"type": "plain"
}
},
"pre_tags": [""],
"post_tags": [""]
}
}
您可以选择突出显示匹配文字,或指定空pre_tags
和post_tags
以显示原始文字。
响应中的highlight
字段仅包含原始源数组中匹配的匹配。
{
...
"hits": {
"total": 1,
"max_score": 0.28582606,
"hits": [
{
"_index": "test",
"_type": "mytype",
"_id": "AWB6-u6V3-7fA7oZt-aX",
"_score": 0.28582606,
"_source": {
"myfield": [
"My favorite toy",
"Another toy for me"
]
},
"highlight": {
"myfield": [
"Another toy for me"
]
}
}
]
}
}
如果数组中有多个值匹配,则返回它们。
{
...
"hits": {
"total": 1,
"max_score": 0.3938048,
"hits": [
{
"_index": "blah",
"_type": "mytype",
"_id": "AWB6-u6V3-7fA7oZt-aX",
"_score": 0.3938048,
"_source": {
"myfield": [
"My favorite toy",
"Another toy for me"
]
},
"highlight": {
"myfield": [
"My favorite toy",
"Another toy for me"
]
}
}
]
}
}
正如您所提到的,当然还有其他选项,使用嵌套文档或父子关系并从中获取内部命中。突出显示是我能找到的唯一能够保持原始文档结构的解决方案。