8

場所があり、各場所に0個以上のイベントを含めることができる非常に単純なモデルについて考えてみます。場所には、名前、説明、ジオポイントデータ(lon / lat)などのプロパティがあります。イベントは1つの場所(その親)に添付する必要があり、名前と説明が必要です。

{
    "location" : {
        "properties": {
            "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
            "description": { "type": "string", "analyzer": "snowball" },
            "geo": { "type": "geo_point" },
            "exhibits": {
                "type": "nested",
                "properties": {
                    "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
                    "description": { "type": "string", "analyzer": "snowball" }
                }
            }
        }
    }
}

私ができるようにしたいのは、子ドキュメント(イベント)を照会して、名前と説明の全文検索を実行することです。一致するイベントを元に戻し、親の場所の名前も取得できるようにしたいと思います。また、場所の座標で結果セットを絞り込みたいと思います。クエリに一致しないイベントを取得したくありません。Elastic Searchでそれは可能ですか?どのタイプのクエリを使用する必要がありますか?

イベントを場所(上記を参照)の下に配列プロパティとして配置し、nestedクエリを使用しようとしましたが、希望する種類の結果が返されません(一致しないイベントも含め、すべてのイベントを含む場所全体が返されると思います)私のクエリ)。_parentプロパティを提供する別のインデックス(マッピング?)にイベントを配置してtop_childrenから、場所に対してクエリを実行しようとしましたが、結果が得られません。

{
    "exhibit": {
        "_parent": { "type": "locations" },
        "properties": {
            "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
            "description": { "type": "string", "analyzer": "snowball" }
        }
    }
}

誰かが光を当てることができますか?どこから始めたらいいのかわからない...

4

1 に答える 1

8

これが私の問題に対する実用的な解決策です、おそらくそれは誰かに役立つでしょう。

ロケーションマッピング:

{
    "location" : {
        "properties": {
            "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
            "description": { "type": "string", "analyzer": "snowball" },
            "geo": { "type": "geo_point" }
        }
    }
}

展示マッピング:

{
    "exhibit": {
        "_parent": { "type": "locations" },
        "properties": {
            "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
            "description": { "type": "string", "analyzer": "snowball" }
        }
    }
}

クエリ:

{
    "fields": [ "_parent", "name", "_source" ],
    "query": {
        "bool": {
            "should": [ 
                { "text": { "name": "candy" } },
                { "text": { "description": "candy" } } 
            ]
        }
    },
    "filter": { 
        "and": [
            {
                "terms" : {
                    "_parent": [ "4e7089a9b97d640b30695b7a", "4e7089eeb97d640b30695b7b" ]
                }
            },
            { "range": { "start": { "lte": "2011-09-22" } } },
            { "range": { "end": { "gte": "2011-09-22" } } }
        ]
    }
}

フィールドを使用してクエリを実行し_parent、展示を制限する場所のIDの配列を渡す必要があります。

于 2011-11-04T16:02:56.157 に答える