Spring BootElasticSearch:创建索引时无法设置@field注解

ioekq8ef  于 2022-10-06  发布在  Spring
关注(0)|答案(1)|浏览(201)

我对ElasticSearch还很陌生,我不能通过字段注解来设置Map。我使用的是弹性Spring Data 4.3.4。我正在通过@Setting注解添加设置,该注解实际上起作用了。但是,如果我将字段类型设置为关键字,它不会被更新,而Elastic会动态地将字段类型Map到文本。我的要求是添加一个规范化程序,以便按字母顺序对特定字段进行排序。请在下面找到我的设置,我真的很感谢你的帮助。

配置:ElasticSearch版本:“7.11.1”,Spring Data 弹性4.3.4。

示例代码

@Document(indexName = "#{@environment.getProperty('elastic.index.prefix')}-test")

@Setting(settingPath=“/ElasticSearch/analyzer.json”)公共类ElasticTest{

@Id
String id;

@Field(type = FieldType.Keyword, normalizer="sort_normalizer")
private String name;

@Field
private String createdDate;

@Field(type=FieldType.Object)
private CustomerType customerType;

=============================================================================

因此,创建索引后,我可以看到添加的设置

"creation_date" : "1664385255792",
    "analysis" : {
      "normalizer" : {
        "sort_normalizer" : {
          "filter" : [
            "lowercase",
            "asciifolding"
          ],
          "type" : "custom",
          "char_filter" : [ ]
        }
      },
      "analyzer" : {
        "custom_pattern_analyzer" : {
          "lowercase" : "true",
          "pattern" : """W|_""",
          "type" : "pattern"
        }
      }
    },

Map:

"name" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },

注意:由于我在本地工作,我必须多次删除并重新创建索引。我可以通过curl/kibana设置这些字段类型。

更新:在这里,我们通过以下方式创建索引:

if (!searchTemplate.indexOps(ElasticContract.class).exists()) {
                searchTemplate.indexOps(ElasticContract.class).create();
            }

并且我们还使用Elasticearch Repository进行查询。

pb3s4cty

pb3s4cty1#

如何创建索引和Map?

如果您使用的是Spring data Elasticearch存储库,则在应用程序启动时不存在带有该设置和Map的索引时,将创建该索引。

如果您不使用存储库,而是使用ElasticsearchOperations,则需要自己创建索引:

ElasticsearchOperations operations;

  IndexOperations indexOps = operations.indexOps(ElasticTest.class);
  indexOps.createWithMapping();

如果您不创建索引,而只是插入一些数据,那么Elasticearch将自动创建索引和Map。您显示的Map是为字符串字段自动创建的典型Map。

您使用的@Field注解是正确的,我们在一个测试中有一个类似的设置来测试这个行为,请参见https://github.com/spring-projects/spring-data-elasticsearch/blob/main/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java#L126-L145

相关问题