弹性搜索 - 多值字段

时间:2017-12-20 14:34:11

标签: elasticsearch multivalue

我有一个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字段转换为此类查询的嵌套对象?我想知道我有一个更直接的方法我错过了......

1 个答案:

答案 0 :(得分:0)

一种方法是使用Highlighting

这是一个相当丰富的功能,但以下示例可帮助您实现目标。

{
    "query": {
        "match": {
            "myfield": "another"
        }
    },
    "highlight": {
        "fields": {
            "myfield": {
                "type": "plain"
            }
        },
        "pre_tags": [""],
        "post_tags": [""]
    }
}

您可以选择突出显示匹配文字,或指定空pre_tagspost_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"
                    ]
                }
            }
        ]
    }
}

正如您所提到的,当然还有其他选项,使用嵌套文档或父子关系并从中获取内部命中。突出显示是我能找到的唯一能够保持原始文档结构的解决方案。