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()); }*/ }