web-dev-qa-db-ja.com

Elasticsearchで文字列のデフォルトマッピングを「分析なし」に変更します

私のシステムでは、データの挿入は常にlogstashを介してcsvファイルを介して行われます。マッピングを事前に定義することはありません。しかし、文字列を入力するときは常にanalyzedとして扱われ、その結果、hello I am SinhaのようなエントリはhelloIamSinhaに分割されます。とにかくElasticsearchのデフォルト/動的マッピングを変更して、インデックスに関係なく、タイプに関係なくすべての文字列をnot analyzedと見なすことができますか?または、.confファイルに設定する方法はありますか? confファイルが次のようになっているとします

input {  
      file {
          path => "/home/sagnik/work/logstash-1.4.2/bin/promosms_dec15.csv"
          type => "promosms_dec15"
          start_position => "beginning"
          sincedb_path => "/dev/null"
      }
}
filter {

    csv {
        columns => ["Comm_Plan","Queue_Booking","Order_Reference","Multi_Ordertype"]
        separator => ","
    }  
    Ruby {
          code => "event['Generation_Date'] = Date.parse(event['Generation_Date']);"
    }

}
output {  
    elasticsearch { 
        action => "index"
        Host => "localhost"
        index => "promosms-%{+dd.MM.YYYY}"
        workers => 1
    }
}

すべての文字列をnot analyzedにしたいのですが、それがElasticSearchに挿入される将来のすべてのデータのデフォルト設定であってもかまいません

35
Sagnik Sinha

フィールドの.rawバージョンを照会できます。これは Logstash 1.3.1 で追加されました:

提供するlogstashインデックステンプレートは、インデックスを作成するすべてのフィールドに「.raw」フィールドを追加します。これらの「.raw」フィールドはlogstashによって「not_analyzed」として設定されるため、分析やトークン化は行われません。元の値がそのまま使用されます。

したがって、フィールドの名前がfooの場合、foo.rawを照会して、not_analyzed(区切り文字で分割されていない)バージョンを返します。

20
Banjer

テンプレートを作成するだけです。走る

curl -XPUT localhost:9200/_template/template_1 -d '{
    "template": "*",
    "settings": {
        "index.refresh_interval": "5s"
    },
    "mappings": {
        "_default_": {
            "_all": {
                "enabled": true
            },
            "dynamic_templates": [
                {
                    "string_fields": {
                        "match": "*",
                        "match_mapping_type": "string",
                        "mapping": {
                            "index": "not_analyzed",
                            "omit_norms": true,
                            "type": "string"
                        }
                    }
                }
            ],
            "properties": {
                "@version": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "geoip": {
                    "type": "object",
                    "dynamic": true,
                    "path": "full",
                    "properties": {
                        "location": {
                            "type": "geo_point"
                        }
                    }
                }
            }
        }
    }
}'
28
Sagnik Sinha

Logstashディストリビューションからlib/logstash/outputs/elasticsearch/elasticsearch-template.jsonのコピーを作成します(/opt/logstash/lib/logstash/outputs/elasticsearch/elasticsearch-template.jsonとしてインストールされている場合があります)。

"dynamic_templates" : [ {
  "string_fields" : {
    "match" : "*",
    "match_mapping_type" : "string",
    "mapping" : {
      "type" : "string", "index" : "analyzed", "omit_norms" : true,
      "fields" : {
        "raw" : {"type": "string", "index" : "not_analyzed", "ignore_above" : 256}
      }
    }
  }
} ],

"dynamic_templates" : [ {
  "string_fields" : {
    "match" : "*",
    "match_mapping_type" : "string",
    "mapping" : {
      "type" : "string", "index" : "not_analyzed", "omit_norms" : true
    }
  }
} ],

変更したファイルにプラグインを出力するためのtemplateをポイントします。

output {
  elasticsearch {
    ...
    template => "/path/to/my-elasticsearch-template.json"
  }
}

特定のフィールドについては、このデフォルトを引き続きオーバーライドできます。

13
Magnus Bäck

マッピングの更新は、レポートの目的でフィールドを処理するだけの間違ったアプローチだと思います。遅かれ早かれ、フィールドでトークンを検索できるようになります。フィールドを「not_analyzed」に更新していて、値「foo bar」からfooを検索したい場合、それを行うことはできません。

より適切なソリューションは、用語の代わりにkibana集約フィルターを使用することです。以下のようなものは、ivr04およびivr02という用語を検索します。そのため、「Hello I'm Sinha」というフィルターを使用できます。お役に立てれば。

enter image description here

1
Arslan Mehboob