2 回答

TA贡献1770条经验 获得超3个赞
您不需要特殊的映射来索引列表 - 每个字段都可以包含一个或多个相同类型的值。请参阅数组数据类型。
在对象列表的情况下,它们可以被索引为object
或nested
数据类型。默认弹性使用object
数据类型。在这种情况下,您可以查询meta.userTags.keyword
or/and meta.userTags.sentiment
。结果将始终包含具有独立匹配值的整个文档,即。搜索keyword=train
,sentiment=-0.76
您将找到带有id=514d4e9f-09e7-4f13-b6c9-a0aa9b4f37a0
.
如果这不是您想要的,您需要为 field 定义嵌套数据类型映射userTags
并使用嵌套查询。

TA贡献1854条经验 获得超8个赞
我使用您提供的文档正文创建了一个新索引“testind”并使用 Postman REST 客户端键入“testTyp”。:
POST http://localhost:9200/testind/testTyp
{
"id":"514d4e9f-09e7-4f13-b6c9-a0aa9b4f37a0",
"created":"2019-09-06 06:09:33.044433",
"meta":{
"userTags":[
{
"intensity":"1",
"sentiment":"0.84",
"keyword":"train"
},
{
"intensity":"1",
"sentiment":"-0.76",
"keyword":"amtrak"
}
]
}
}
当我查询索引的映射时,这就是我得到的:
GET http://localhost:9200/testind/testTyp/_mapping
{
"testind":{
"mappings":{
"testTyp":{
"properties":{
"created":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"id":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"meta":{
"properties":{
"userTags":{
"properties":{
"intensity":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"keyword":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"sentiment":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
}
}
}
}
}
}
}
}
正如您在映射中看到的那样,字段是映射的一部分,将来可以根据需要进行查询,所以只要字段名称不是其中之一,我就不会在这里看到问题 - https://www .elastic.co/guide/en/elasticsearch/reference/6.4/sql-syntax-reserved.html(您可能希望避免使用“关键字”一词,因为稍后在编写搜索查询时可能会造成混淆,因为字段名和类型都是相同 - '关键字')。另外,请注意一件事,映射是通过动态映射创建的(https://www.elastic.co/guide/en/elasticsearch/reference/6.3/dynamic-field-mapping.html#dynamic-field-mapping) 在 Elasticsearch 中,因此数据类型由 elasticsearch 根据您提供的值确定。但是,这可能并不总是准确的,因此为了防止您可以使用 PUT _mapping API 为索引定义自己的映射,并且然后防止将类型中的新字段添加到映射中。
添加回答
举报