web-dev-qa-db-ja.com

Java apiを使用してelasticsearchマッピングを構成します

インデックスを作成する前に分析したくないelasticsearchフィールドがいくつかあります。これを行う正しい方法は、インデックスマッピングを変更することです。現在、私のマッピングは次のようになっています。

{
  "test" : {
   "general" : {
      "properties" : {
        "message" : {
          "type" : "string"
        },
        "source" : {
          "type" : "string"
        }
      }
    }
  }
}

そして、私はそれをこのように見せたいです:

{
  "test" : {
   "general" : {
      "properties" : {
        "message" : {
          "type" : "string",
          "index" : "not_analyzed"
        },
        "source" : {
          "type" : "string"
        }
      }
    }
  }
}

を介して設定を変更しようとしています

client.admin().indices().prepareCreate("test")
        .setSettings(getGrantSettings());

GetGrantSettings()は次のようになります。

static Settings getGrantSettings(){
    JSONObject settingSource = new JSONObject();
    try{
        settingSource.put("mapping", new JSONObject()
        .put("message", new JSONObject()
            .put("type", "string")
            .put("index", "not_analyzed")
        ));
    } catch (JSONException e){
        e.printStackTrace();
    }


    Settings set = ImmutableSettings.settingsBuilder()
            .loadFromSource(settingSource.toString()).build();
    return set;
}
11
user3618259

次のようなJava APIを使用して、Elasticsearchインデックスにマッピングを正常に適用しました。

 XContentBuilder mapping = jsonBuilder()
                              .startObject()
                                   .startObject("general")
                                        .startObject("properties")
                                            .startObject("message")
                                                .field("type", "string")
                                                .field("index", "not_analyzed")
                                             .endObject()
                                             .startObject("source")
                                                .field("type","string")
                                             .endObject()
                                        .endObject()
                                    .endObject()
                                 .endObject();

  PutMappingResponse putMappingResponse = client.admin().indices()
                .preparePutMapping("test")
                .setType("general")
                .setSource(mapping)
                .execute().actionGet();

お役に立てれば。

20
Paige Cook

将来の読者のためにこれを追加します。実際のインデックスを作成する前にマッピングを実行する必要があることに注意してください。そうしないと、例外が発生します。次のコードを参照してください。

client.admin().indices().create(new CreateIndexRequest("indexname")).actionGet();

PutMappingResponse putMappingResponse = client.admin().indices()
    .preparePutMapping("indexname")
    .setType("indextype")
    .setSource(jsonBuilder().prettyPrint()
                .startObject()
                    .startObject("indextype")
                        .startObject("properties")
                            .startObject("country").field("type", "string").field("index", "not_analyzed").endObject()
                        .endObject()
                    .endObject()
                .endObject())
    .execute().actionGet();

IndexResponse response1 = client.prepareIndex("indexname", "indextype")
    .setSource(buildIndex())
    .execute()
    .actionGet();   

// Now "Sri Lanka" considered to be a single country :) 
SearchResponse response = client.prepareSearch("indexname"
    ).addAggregation(AggregationBuilders.terms("countryfacet").field("country")).setSize(30).execute().actionGet(); 
11

決定的なガイド を注意深く読んでください:

既存のマッピングに追加することはできますが、既存のフィールドマッピングを変更することはできません。フィールドのマッピングがすでに存在する場合、そのフィールドのデータはおそらくインデックス付けされています。フィールドマッピングを変更すると、インデックス付きデータが間違ってしまい、適切に検索できなくなります。

出典: https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html#updating-a-mapping

したがって、フィールドを作成するときにそれを行う必要があります。そのため、 この回答 のコードは問題なく機能します。

0
neun24

したがって、elasticsearchのドキュメントはそのトピックに関してかなり時代遅れであることがわかります。 not_analyzedはもう存在せず、文字列はテキストになりました。試行錯誤の末、私はこれを思いついた:

CreateIndexRequest createIndexRequest = new CreateIndexRequest("yourIndexName");
XContentBuilder mapping = jsonBuilder()
                .startObject()
                  .startObject("properties")
                    .startObject("yourProperty")
                      .field("type", "keyword")
                    .endObject()
                  .endObject()
                .endObject();
createIndexRequest.mapping("yourEntityName", mapping);
client.indices().create(createIndexRequest);

これで、用語クエリを使用した場合にのみ、yourPropertyに正確な値をクエリできます。

0
bAZtARd