springboot2.2.7整合elasticsearch7.3.2(此篇先临时记录下利用javaapi构建索引结构)

之前用的比较基础就寻思再学习下,这里基础的配置什么已经搭建完了,先记录java api构建索引结构 导入数据 简单搜索的测试用例 其他封装好的东西回头再写

由于我也是刚学习 很多东西我也一知半解试着搞 有大佬看到更好更全的博客告诉我谢谢了!!

官方文档地址

https://www.elastic.co/guide/en/elasticsearch/reference/7.x/date.html

 

构建索引结构

内部字段解释都有注释(这里是说我用到的,其他的请看官方文档 博客好多抄来抄去的 只管用也不知道啥意思。。。)

//构建索引
@Test
public void createIndex() throws IOException {
    String indexName = "test_index";

    XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
            //dynamic true 新字段动态添加 false:数据可写入但该字段不保留 strict:无法写入抛异常
            //这里的startObject可以理解为json里的大括号吧 field就是字段
             .startObject().field("dynamic","false")
                //properties 类型映射、对象字段和嵌套字段包含子字段,称为属性(官方文档然后翻译的 咱也不懂 文档有我也就加了...)
                .startObject("properties")
                    //这层里的就是我自己定义的字段了
                    .startObject("lookId")
                        //type 指定数据类型 类型很多看文档吧
                        .field("type","keyword")
                    .endObject()
                    .startObject("content")
                        .field("type","text")
                        //analyzer 指定分词器 一般就用细粒度吧:ik_max_word
                        .field("analyzer", "ik_max_word")
                        //index 这个设置为false的话是不能被用来查询条件的
                        .field("index", "true")
                    .endObject()
                    .startObject("title")
                        .field("type","text")
                        .field("analyzer", "ik_max_word")
                        .field("index", "true")
                    .endObject()
                    .startObject("create_time")
                        .field("type", "date")
                        //format 这个就是格式化日期的吧 我直接按官网写了三 不过我导完数据看里面是时间戳
                        .field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")
                    .endObject()
                    .startObject("describe")
                        .field("type","text")
                        .field("index","false")
                    .endObject()
                    .startObject("name")
                        .field("type","keyword")
                        .field("index","false")
                    .endObject()
                .endObject()
            .endObject();
    restHighLevelClientService.createIndexResponse(indexName,xContentBuilder);
}

成功之后看es-head插件里就会有  那个test_indexalias是索引的别名

导入数据

@Test
public void importData() throws IOException {
    List<String> lisT = new ArrayList<>();
    JSONObject jsonObject1 = new JSONObject();
    jsonObject1.put("lookId", "1");
    jsonObject1.put("content","使用分隔符将它们分开,可以指定多种格式。依次尝试每种格式,直到找到匹配的格式。第一种格式将用于将毫秒数(从纪元开始)转换回字符串。");
    jsonObject1.put("title", "【天猫海外直营】");
    jsonObject1.put("create_time", new Date());
    jsonObject1.put("describe", "请注意,sort自纪元以来,返回的所有值均以毫秒为单位。");
    jsonObject1.put("name", "张三李四");
    lisT.add(jsonObject1.toJSONString());
    JSONObject jsonObject2 = new JSONObject();
    jsonObject2.put("lookId", "2");
    jsonObject2.put("content","自几个月以来,解析日期时使用的语言环境在所有语言中的名称和/或缩写都不相同。默认为 ROOT语言环境,");
    jsonObject2.put("title", "【京东直营】");
    jsonObject2.put("create_time", new Date());
    jsonObject2.put("describe", "该字段是否可以搜索?接受true(默认)和false。");
    jsonObject2.put("name", "王五赵六");
    lisT.add(jsonObject2.toJSONString());
    JSONObject jsonObject3 = new JSONObject();
    jsonObject3.put("lookId", "3");
    jsonObject3.put("content","字段值是否应该与_source字段分开存储和检索。接受true或false (默认)。");
    jsonObject3.put("title", "【拼多多】");
    jsonObject3.put("create_time", new Date());
    jsonObject3.put("describe", "有关该字段的元数据。");
    jsonObject3.put("name", "韩七");
    jsonObject3.put("add_test", "biubiubiu");//设置了新增字段忽略 所以多加这个不会存进去
    lisT.add(jsonObject3.toJSONString());
    restHighLevelClientService.importAll("test_index", lisT);
}

导进去的数据再es-head是这样的

简单的搜索  我自己试了试没啥问题 搜索方法我是在工具类里 下次再写吧

@Test
public void searchData() throws IOException {
    //这样是无法搜索的  因为构建索引的时候设置了name字段的index为false
    /*SearchResponse search = restHighLevelClientService.search("name", "韩七","test_index");
    SearchHits hits = search.getHits();
    SearchHit[] hits1 = hits.getHits();
    for (SearchHit documentFields : hits1) {
        System.out.println(documentFields.getSourceAsString());
    }*/
    //模糊搜索
    SearchResponse search = restHighLevelClientService.search("content", "以来","test_index");
    SearchHits hits = search.getHits();
    SearchHit[] hits1 = hits.getHits();
    for (SearchHit documentFields : hits1) {
        System.out.println(documentFields.getSourceAsString());
    }
    //单条件搜索
    /*SearchResponse search2 = restHighLevelClientService.search("name", "韩七","test_index");
    SearchHits hits2 = search2.getHits();
    SearchHit[] hits3 = hits2.getHits();
    for (SearchHit documentFields : hits3) {
        System.out.println(documentFields.getSourceAsString());
    }*/
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值