web-dev-qa-db-ja.com

elasticsearch-集計は完全なフィールドではなくkeyで用語を返します。フィールド全体を返すにはどうすればよいですか?

Elasticsearch実装では、以下に示すように、いくつかのフィールドに基づいていくつかの単純な集計があります-

 "aggs" : {
    "author" : {
        "terms" : { "field" : "author" 
          , "size": 20,
          "order" : { "_term" : "asc" }
        }
    },
    "title" : {
        "terms" : { "field" : "title" 
          , "size": 20
        }
    },
    "contentType" : {
        "terms" : { "field" : "docType" 
          , "size": 20
        }
    }
}

集計は正常に機能し、それに応じて結果が得られます。ただし、返されるタイトルキーフィールド(または他のフィールド-複数のWord)には、単一のWord集計と結果があります。返される結果には完全なタイトルが必要です。単語だけではなく、あまり意味がありません。どうすれば入手できますか。

現在の結果(単なるスニペット)-

"title": {
     "buckets": [
        {
           "key": "test",
           "doc_count": 1716
        },
        {
           "key": "pptx",
           "doc_count": 1247
        },
        {
           "key": "and",
           "doc_count": 661
        },
        {
           "key": "for",
           "doc_count": 489
        },
        {
           "key": "mobile",
           "doc_count": 487
        },
        {
           "key": "docx",
           "doc_count": 486
        },
        {
           "key": "pdf",
           "doc_count": 450
        },
        {
           "key": "2012",
           "doc_count": 397
        } ] }

予期された結果 -

"title": {
         "buckets": [
            {
               "key": "test document for stack overflow ",
               "doc_count": 1716
            },
            {
               "key": "this is a pptx",
               "doc_count": 1247
            },
            {
               "key": "its another document and so on",
               "doc_count": 661
            },
            {
               "key": "for",
               "doc_count": 489
            },
            {
               "key": "mobile",
               "doc_count": 487
            },
            {
               "key": "docx",
               "doc_count": 486
            },
            {
               "key": "pdf",
               "doc_count": 450
            },
            {
               "key": "2012",
               "doc_count": 397
            } }

多くのドキュメントを調べましたが、結果を集計するさまざまな方法が説明されていますが、結果のキーにフィールドがある場合、全文を取得する方法が見つかりませんでした。

27
dev123

インデックス内の用語のトークン化されていないコピーが必要です。マッピングでは multi-fields を使用します。

{
    "test": {
        "mappings": {
            "book": {
                "properties": {                
                    "author": {
                        "type": "string",
                        "fields": {
                            "untouched": {
                                "type": "string",
                                "index": "not_analyzed"
                            }
                        }
                    },
                    "title": {
                        "type": "string",
                        "fields": {
                            "untouched": {
                                "type": "string",
                                "index": "not_analyzed"
                            }
                        }
                    },
                    "docType": {
                        "type": "string",
                        "fields": {
                            "untouched": {
                                "type": "string",
                                "index": "not_analyzed"
                            }
                        }
                    }
                }
            }
        }
    }
}

集約クエリで、トークン化されていないフィールドを参照します。

"aggs" : {
    "author" : {
         "terms" : { 
            "field" : "author.untouched", 
            "size": 20,
            "order" : { "_term" : "asc" }
        }
     },
    "title" : {
        "terms" : { 
          "field" : "title.untouched", 
          "size": 20
        }
    },
    "contentType" : {
        "terms" : { 
           "field" : "docType.untouched", 
           "size": 20
        }
    }
}
28
Dan Tuffery

上記の投稿で指定されたmulti_fieldsは廃止予定のようです http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/_multi_fields.html#_multi_fields

0
Ankireddy Polu

私は同様の問題に遭遇しました。コマンドを実行したとき:

   curl -XGET "localhost:9200/logstash*/_mapping?pretty"

応答はそれに役立ちましたが、役に立ちました:

   "Host" : {
     "type" : "string",
       "norms" : {
         "enabled" : false
       },
       "fields" : {
         "raw" : {
           "type" : "string",
           "index" : "not_analyzed",
           "ignore_above" : 256
         }
       }
     },...

.rawを追加すると出力が変更され、目的の出力が得られることに気付きました。

のようなもの:

      "aggs": {
        "computes": {
          "terms": {
            "field": "Host.raw",
            "size": 0
          }
        }         
      }

私のためにトリックをしました。

Elasticsearchの初心者ですが、文字列型の多くのフィールドに、クエリ内で使用できる「raw」フィールドがあることがわかりました。

何人かの専門家が私の調査結果に光を当てることができればよいでしょう。正解/部分的に正解/誤り?!

0
rms_13