我正在为一个新项目学习弹性。我有一个索引格式:
{
"content_id": "bbbbbb",
"title": "content 2",
"data": [
{
"id": "xx",
"value": 3,
"tags": ["a","b","c"]
},
{
"id": "yy",
"value": 1,
"tags": ["e","d","c"]
}
]
}
如何查询在data中至少有一个元素的内容标签"a"one_answers"b">
?非常感谢!
如何进行查询或重新设计我的格式数据,以方便进行新的查询?
在Elasticsearch中使用列表和嵌套文档有点棘手。
创建索引时,需要为嵌套文档指定映射。您可以通过为数据字段添加映射来实现这一点。
PUT /my_index
{
"mappings": {
"doc": {
"properties": {
"data": {
"type": "nested"
}
}
}
}
}
如果您已经创建了索引,您应该先删除它,然后用映射重新创建它。
在删除索引之前,可以将数据重新索引(复制)到一个新的索引中。
现在您可以使用嵌套查询查询数据字段:
GET /my_index/_search
{
"query": {
"nested": {
"path": "data",
"query": {
"terms": {
"data.tags": [
"j",
"b",
"c"
]
}
}
}
}
}
如果data
中至少有一个对象包含a
和b
,则要求获取文档,则需要按照@ChamRun的建议指定nested
映射。
但是对于获得具有a
和b
的结果,则需要使用以下查询:
{
"query": {
"nested": {
"path": "data",
"query": {
"bool": {
"must": [
{
"term": {
"data.tags": "a"
}
},
{
"term": {
"data.tags": "b"
}
}
]
}
}
}
}
}