Elasticsearchでのマッピングについて注目に値するいくつかの小さな詳細

前書き

Elasticsearchでマッピングを構成する場所はたくさんありますが、使いすぎると、一般的に、マッピングの最も一般的で実用的な側面は、注意が必要な単純な側面であることがわかります。

これらのマッピングの注目すべき側面について簡単に紹介します。

もちろん、マッピングについて詳しく知りたい場合は、後で参照リンクを参照してください。

マッピングを追加

# 添加为索引添加mapping
curl -X PUT http://localhost:9200/index-name/_mapping
# 查看索引的mapping
curl -X GET http://localhost:9200/index-name/_mapping

マッピングを追加する本文部分は次のとおりです。

{
    
    
  "mappings": {
    
    
      "dynamic": "strict",
      "properties": {
    
    
        "title": {
    
    
          "type": "text",
          "norms":false,
          "doc_values":false
        },
        "name": {
    
    
          "type": "keyword"
        },
        "attach": {
    
    
          "type": "text",
          "enable":false
        }
      }
  }
}

マッピングでは、動的パラメーターを "strict"に設定することをお勧めします。これにより、追加されたドキュメントにマッピングにないフィールドがある場合、例外が発生する可能性があります。もちろん、フィールドを増やしたいだけでもかまいません。dynamicをfalseに設定できるため、マッピングにないフィールドは無視されます。

デフォルトのダイナミックはtrueです。ドキュメント内にマッピングにないフィールドがある場合、対応するフィールドがマッピングに追加され、型の推論が行われます。これは最も便利ですが、メンテナンスには役立ちません。

現場で検討する価値のあるパラメータ:

  1. 並べ替える必要がない場合は、集約doc_valuesをfalseに設定する必要があります(メール、ユーザー名など)。
  2. テキストタイプの場合、スコアリングに参加する必要がない場合は、基準をfalseに設定するのが最適です。
  3. 保存するだけでフィールドを検索したくない場合は、enableをfalseに設定できます。
  4. フィールドがスコアリングに参加する必要があるが、フィールドをセグメント化しない場合は、インデックスをfalseに設定できます

マッピングを更新

curl -X PUT http://localhost:9200/index-name/_mapping
{
    
    
  "properties": {
    
    
    "gid": {
    
    
      "type": "text",
      "index": false
    }
  }
}

インデックスを更新するためのマッピングもPUTを使用します。注目に値する点は次のとおりです。

  1. マッピングはフィールドとパラメーターを削除または変更できません。フィールドとパラメーターを追加するだけです
  2. マッピングの追加、マッピングの更新とは異なり、最も外側のレイヤーにはマッピングがなく、プロパティから直接開始します

動的テンプレート、動的パラメータ、その他のパラメータを設定する必要がない場合は、マッピングを追加するときにプロパティから直接開始することもできます

マッピングを追加するJavaの方法

@Test
public void addMapping() throws Exception {
    
    
    HttpHost httpHostOne = new HttpHost("127.0.0.1", 9200, "http");
    RestClientBuilder builder = RestClient.builder(httpHostOne);
    RestHighLevelClient client = new RestHighLevelClient(builder);
    String indexName = "index-name";
    IndicesClient indicesClient = client.indices();
//        mapping是针对索引,所以先添加索引,当然也可以在添加索引的时候就设置
    CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName).settings(getDefaultSetting());
    indicesClient.create(createIndexRequest, RequestOptions.DEFAULT);

    XContentBuilder mapping = XContentFactory.jsonBuilder()
            .startObject()
            .startObject("properties")
            .startObject("gid").field("type", "keyword").field("doc_values",false).endObject()
            .startObject("serverId").field("type", "integer").endObject()
            .endObject()
            .endObject();
    PutMappingRequest putMappingRequest = new PutMappingRequest(indexName).source(mapping);
    indicesClient.putMapping(putMappingRequest, RequestOptions.DEFAULT);
}

private static Settings getDefaultSetting(){
    
    
    return Settings.builder()
            .put("index.refresh_interval", "60s")
            .put("index.number_of_shards", "3")
            .put("index.number_of_replicas", "1")
            .build();
}

参照

マッピング
マッピングテンプレート

おすすめ

転載: blog.csdn.net/trayvontang/article/details/107919853