我在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"
}
}
}
}
}