2

私は、elasticsearch を使用してオブジェクト内の特定のフィールドを照会する方法を見つけようとしています。私のインデックス付きドキュメントは次のようになります。

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

たとえば、に対してクエリを作成するにはどうすればよいmeta.title.valueですか?
これは実際にサポートされていますか?
次のようなキーを指定せずに、これらの値を照会できます。

{
    query: 'foo'
}

正しい結果が返されますが、メタオブジェクト内の特定のキーを検索したいだけの場合、その方法がわかりません。
より具体的には、それが違いを生む場合に使用mongooseしています。mongoosastic

ここで、elasticsearch での私のドキュメント マッピング:

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

2 に答える 2

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 .

ただし、特定のフィールドによるクエリは最も基本的なことの 1 つ (IMHO) であるため、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"
                        }
                    }
                }
            }
        }
    }
}
于 2014-08-09T16:45:21.077 に答える