之前用的比较基础就寻思再学习下,这里基础的配置什么已经搭建完了,先记录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());
}*/
}