在ElasticSearch中进行查询

hjqgdpho  于 2022-12-17  发布在  ElasticSearch
关注(0)|答案(2)|浏览(115)

我正在为一个新项目学习弹性。我有一个索引格式:

{
    "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”和“B”**的内容?
非常感谢!!
我如何进行查询或重新设计我的格式数据,以方便进行新的查询?

2admgd59

2admgd591#

在Elasticsearch中处理列表和嵌套文档有点棘手。
创建索引时,需要指定嵌套文档的Map。可以通过为数据字段添加Map来完成此操作。

PUT /my_index

{
    "mappings": {
        "doc": {
            "properties": {
                "data": {
                    "type": "nested"
                }
            }
        }
    }
}

如果您已经创建了索引,那么您应该先将其delete,然后使用Map再次创建它。
在删除索引之前,可以将数据reindex(复制)到新索引。
现在可以使用嵌套查询查询数据字段:

GET /my_index/_search

{
    "query": {
        "nested": {
            "path": "data",
            "query": {
                "terms": {
                    "data.tags": [
                        "j",
                        "b",
                        "c"
                    ]
                }
            }
        }
    }
}
bq8i3lrv

bq8i3lrv2#

如果要求在data中至少有一个对象同时包含**ab的情况下获取文档,则需要按照@ChamRun的建议指定nestedMap。
但是,要获得同时具有
ab**的结果,您需要使用以下查询:

{
    "query": {
        "nested": {
            "path": "data",
            "query": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "data.tags": "a"
                            }
                        },
                        {
                            "term": {
                                "data.tags": "b"
                            }
                        }
                    ]
                }
            }
        }
    }
}

相关问题