Elasticsearch按数组中的值查询



我在ES6中索引了以下文档:

{
"id": 1234,
...,
"images": [
{
"id": 1703805,
...,
"language_codes": [],
"ingest_source_ids": [123]
},
{
"id": 2481938,
...,
"language_codes": ["EN"],
"ingest_source_ids": [1,2,3]
}
]
}

images对象映射为nested

我可以用这个查询找到文档:

{
"query": {
"nested": {
"path": "images",
"query": {
"term": {
"images.ingest_source_ids": 123
}
}
}
}
}

但是如果我想通过languages_codes找到,我找不到文档:

{
"query": {
"nested": {
"path": "images",
"query": {
"term": {
"images.language_codes": "EN"
}
}
}
}
}

ingest_source_ids从第一天起就存在于文件中。language_codes字段是后来添加的。我确实记得Elasticsearch对初始文档做了一些神奇的映射,但另一方面,据我在文档中读到的,数组不需要特殊的映射——只要所有键都是相同类型,所有字段都可以包含数组。

在这种情况下,ingest_source_ids中的所有键都是数字,但language_codes也总是字符串,所以应该是相同的情况。

我错过了什么?

如果您没有显式地为language_codes定义任何索引映射,那么默认情况下它将被索引为:

"language_codes": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}

考虑到您正在使用term查询,您必须在keyword类型字段上使用该查询,以便查询词与确切的词文档匹配。

用:

{
"query": {
"nested": {
"path": "images",
"query": {
"term": {
"images.language_codes.keyword": "EN"
}
}
}
}
}

最新更新