gpt4 book ai didi

Elasticsearch:检查对象类型字段中是否存在键

转载 作者:行者123 更新时间:2023-12-02 22:21:23 26 4
gpt4 key购买 nike

我的索引 test有下一个映射:

{
"test" : {
"mappings" : {
"_doc" : {
"properties" : {
"bar" : {
"type" : "keyword"
},
"baz" : {
"type" : "long"
},
"foo" : {
"type" : "object",
"enabled" : false
}
}
}
}
}
}

该索引有 2 个文档:
{
"total": 2,
"max_score": 1.0,
"hits": [
{
"_index": "test",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"baz": 123,
"bar": [
"php",
"python"
],
"foo": {
"1": "bla",
"2": "blu"
}
}
},
{
"_index": "test",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"baz": 123,
"bar": [
"java",
"python"
],
"foo": {
"3": "blue",
"4": "blae"
}
}
}
]
}

我只想获取字段中包含键 1 的文档 foo . (所以在我的情况下,这是一个 _id = 1 的文档)。

哪个查询适合于此?

Elasticsearch 6.5 版

最佳答案

您已设置 "enabled": false在您的映射中。将其设置为 true或者更确切地说,删除它会再次将其设置为 true默认情况下。

enabled 的目的如果设置为 true是它允许 ES 为字段创建倒排索引,以便它们可以被搜索。制作 false这意味着 ES 将完全跳过读取这些字段及其内容。

请注意,默认情况下,如果您未在映射中指定它,则将其设置为 true .

以下是您的映射方式:

PUT <your_index_name>
{
"mappings" : {
"properties" : {
"bar" : {
"type" : "keyword"
},
"baz" : {
"type" : "long"
},
"foo" : {
"type" : "object",
"enabled" : true <---- Note this, either this or remove this to have this option
}

}
}
}

一旦你这样做了,你就可以使用exists查询来获得你想要的。
POST <your_index_name>/_search
{
"query": {
"bool": {
"must": [
{
"exists": {
"field": "foo.1"
}
}
]
}
}
}

建议的解决方案:

根据我对评论的理解,您有 ids文档为 sub-fields在您的 object 内类型。

为什么不将您的映射更改为如下所示:
POST my_sample_index
{
"mappings":{
"properties":{
"bar":{
"type":"keyword"
},
"baz":{
"type":"long"
},
"foo":{
"type":"object",
"properties":{
"id":{ <--- Field for id
"type":"keyword"
},
"value":{ <--- Corresponding field for its value
"type":"text"
}
}
}
}
}
}

这样,文件将如下所示:
POST my_sample_index/_doc/1
{
"baz":123,
"bar":[
"java",
"python"
],
"foo":[
{
"id":"1",
"value":"blue"
},
{
"id":2,
"value":"black"
}
]
}

现在您可以简单地根据 id 的值进行查询字段与 Term Query 一样简单:
POST my_exists_index/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"foo.id": "1"
}
}
]
}
}
}

现在您可以看到映射中的字段数量只有两个 idvalue当您可能拥有的文档数量不确定时,而不是动态创建它。

重要提示:您可能还想查看 nested 数据类型而不是 object .此外,如果您正在使用 nested数据类型,你必须使用 Nested Queries .请务必阅读上述链接,了解我建议您浏览它们的原因。

希望能帮助到你!

关于Elasticsearch:检查对象类型字段中是否存在键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60744873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com