如何使用elasticsearch查询对象中的值

时间:2014-08-08 20:44:22

标签: elasticsearch mongoosastic

我试图弄清楚如何使用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"
                    }
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:4)

特定字段的查询示例:

{
    "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

您可以创建多种类型的查询。尝试通过大部分内容(首先,我建议你"匹配","术语"," bool","嵌套", "模糊"和#34;通配符")创建小例子。


修改1

我向您提出建议:不要创建名称为" value"的字段,否则我们将不得不创建无用的嵌套查询。

这是您的映射建议:

"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"
                        }
                    }
                }
            }
        }
    }
}

答案 1 :(得分:-1)

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

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

你显然必须指定一个密钥。如果要查看许多字段,可以使用$或运算符

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

这将返回foometa.title.value

meta.headline.value值为{{1}}的每个文档