梦醒心碎 2019-06-28 10:29 采纳率: 0%
浏览 319

一个关于spring-data-elasticSearch的问题

首先呢,我设置了一个model

@Data
@Document(indexName = "myes2", type = "tt")
public class MyEs2 implements Serializable {

    @Id
    @Field(type = FieldType.Long, store = true, index = false)
    private Long id;

    @Field(type = FieldType.Text, store = true, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String title;

    @Field(type = FieldType.Text, store = true, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String content;
}

可以看到ID我设置的是long类型,但是呢生成的mapping就变成了keyword

{
    "myes2": {
        "mappings": {
            "tt": {
                "properties": {
                    "content": {
                        "type": "text",
                        "store": true,
                        "analyzer": "ik_max_word",
                        "search_analyzer": "ik_smart"
                    },
                    "id": {
                        "type": "keyword"
                    },
                    "title": {
                        "type": "text",
                        "store": true,
                        "analyzer": "ik_max_word",
                        "search_analyzer": "ik_smart"
                    }
                }
            }
        }
    }
}

如果我强制把这个改成LONG,执行保存的时候,就会抛异常
图片说明
这是为什么呀,感觉好烦呀,虽然不影响我用,我也不会把ID设置成LONG,但是我搜遍了全网也没有找到有这类的问题,如果是官方就这么设计的,希望大家告诉我一下,顺便告诉我在哪看到的这么设计的,我的环境是

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>

jdk是1.8
elasticsearch是6.2.4版本,我的强迫症都快犯了

  • 写回答

1条回答 默认 最新

  • 明初啥都能学会 2024-04-24 14:57
    关注

    该回答引用ChatGPT3.5,结果代码方法已验证可行

    这可能是由于Spring Data Elasticsearch默认将@Id字段映射为keyword类型,而不是你所期望的long类型。这是因为Elasticsearch中的主键(ID)通常使用keyword类型来进行精确匹配。

    如果你想要将@Id字段映射为long类型,你可以尝试手动定义索引的映射方式,而不是依赖于Spring Data Elasticsearch的自动生成。

    你可以通过在配置类中定义Elasticsearch的MappingBuilder来手动指定字段映射类型。以下是一个示例代码,展示了如何手动指定"id"字段映射类型为long:

    import org.elasticsearch.client.Client;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
    import org.springframework.data.elasticsearch.core.EntityMapper;
    import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
    import org.springframework.data.elasticsearch.core.query.IndexQuery;
    import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
    
    import java.io.IOException;
    
    @Configuration
    public class ElasticsearchConfig {
    
        @Bean
        public ElasticsearchTemplate elasticsearchTemplate(Client client, EntityMapper entityMapper) {
            ElasticsearchTemplate elasticsearchTemplate = new ElasticsearchTemplate(client, new SimpleElasticsearchMappingContext());
            elasticsearchTemplate.setEntityMapper(entityMapper);
            try {
                createMapping(elasticsearchTemplate);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return elasticsearchTemplate;
        }
    
        private void createMapping(ElasticsearchTemplate elasticsearchTemplate) throws IOException {
            String mapping = "{\n" +
                    "  \"mappings\": {\n" +
                    "    \"tt\": {\n" +
                    "      \"properties\": {\n" +
                    "        \"id\": {\n" +
                    "          \"type\": \"long\"\n" +
                    "        }\n" +
                    "      }\n" +
                    "    }\n" +
                    "  }\n" +
                    "}";
            elasticsearchTemplate.getClient().admin().indices()
                    .preparePutMapping("myes2")
                    .setType("tt")
                    .setSource(mapping)
                    .get();
        }
    }
    

    这段代码中,通过定义ElasticsearchConfig类,手动指定了"id"字段的映射类型为long。然后在创建ElasticsearchTemplate时,调用createMapping方法来应用这个映射配置。

    这样,你就可以将@Id字段映射为long类型,而不会抛出异常了。

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘