【问题标题】:how to query for values in an object with elasticsearch如何使用elasticsearch查询对象中的值
【发布时间】:2014-10-02 10:22:18
【问题描述】:

我试图弄清楚如何使用 elasticsearch 查询对象中的特定字段。 我的索引文档如下所示:

{
    name : 'thename'
    meta : {
        title : {value: 'foo is the title'}
        headline: {value : 'bar is the headline'}
    }
}

例如,我将如何创建针对 meta.title.value 的查询?
这真的支持吗?
我可以在不指定键的情况下查询这些值:

{
    query: 'foo'
}

我得到了正确的结果,但如果我只想在元对象中搜索那个特定的键,我不知道该怎么做。
更具体地说,我使用mongoosemongoosastic,如果这有什么不同的话。

这里是我在 elasticsearch 上的文档映射:

"mappings": {
    "asset": {
        "properties": {
            "kind": {
                "type": "string"
            },
            "meta": {
                "properties": {
                    "description": {
                        "properties": {
                            "value": {
                                "type": "string"
                            }
                        }
                    },
                    "headline": {
                        "properties": {
                            "value": {
                                "type": "string"
                            }
                        }
                    },
                    "visible": {
                        "type": "boolean"
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: elasticsearch mongoosastic


    【解决方案1】:

    特定字段查询示例:

    {
        "query": {
            "match" : {
                "name" : "thename"
            }
        }    
    }
    

    在上面的示例中,“name”是您要查询的字段的名称。

    对于嵌套数据的情况(比如meta.title),可以看一下我在本主题https://stackoverflow.com/a/25203970/3917476发的“如何查询嵌套字段”小节或者查看“嵌套查询”“嵌套类型”文档:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html#query-dsl-nested-query

    但是,我发现您应该阅读 ElasticSearch 文档,因为按特定字段查询是最基本的事情之一(恕我直言)。 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-queries.html

    您可以创建多种类型的查询。尝试浏览其中的大多数(首先,我建议您使用“match”、“term”、“bool”、“nested”、“fuzzy”和“wildcard”)创建小示例。


    编辑 1

    我给你一个建议:不要创建名称为“值”的字段,否则我们将不得不创建无用的嵌套查询。

    这是对您的映射的建议:

    "mappings": {
        "asset": {
            "properties": {
                "kind": {
                    "type": "string"
                },
                "meta": {
                    "properties": {
                        "description": {
                            "type": "string"
                        },
                        "headline": {
                            "type": "string"
                        },
                        "visible": {
                            "type": "boolean"
                        }
                    }
                }
            }
        }
    }
    

    通过此映射,您可以使用以下查询:

    {
        "query": {
            "nested": {
                "path": "meta",
                "query": {
                    "term": {
                        "description": "foo"
                    }
                }
            }
        }
    }
    

    否则,您可以将此查询用于现有映射:

    {
        "query": {
            "nested": {
                "path": "meta",
                "query": {
                    "nested": {
                        "path": "description",
                        "query": {
                            "term": {
                                "value": "foo"
                            }
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 嗨@dan,我用elasticsearch的映射更新了我的问题。即使在阅读了如何查询嵌套字段之后。鉴于我拥有的索引,我希望能够创建像meta.title.value:foo 这样的查询。或对此处最后一段的误解:elasticsearch.org/guide/en/elasticsearch/reference/current/…?
    • 查询现在有效。感谢您为我指明正确的方向
    • 我添加了更多信息。我希望它对你有帮助。 :)
    【解决方案2】:

    使用 mongodb 你会想要做这样的事情:

    查询:{'meta.title.value': 'foo'}

    你显然必须指定一个键。如果您想查看多个字段,可以使用 $or 运算符

    查询:{$or: [{'meta.title.value': 'foo'}, {'meta.headline.value': 'foo'}]}

    这将返回在meta.title.valuemeta.headline.value 中具有foo 作为值的每个文档

    【讨论】:

    • 伙计们,我不知道你怎么了。这是我得到的关于如何使用 mongo 的第二个答案。请阅读标题和问题。我知道它在 mongo 中是如何工作的。但这不是我要问的!
    • '更具体地说,如果这有什么不同,我正在使用 mongoose 和 mongoosastic。'操作它让我感到困惑抱歉
    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2015-01-13
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多