elasticsearch 教程(一)程序建立索引
从elasticsearch 8.x开始,除了通过kibana建立索引之外,还可以在Java程序定义索引。待程序运行时,会先检测是否建立索引,如果已建立索引,即使程序中定义的索引结构发生变化,也不会删除索引然后再重建索引;如果没有建立索引,则会按照程序中定义的索引结构新建索引。
下面首先来讲一下es 8.x中的两个注解@Setting
和@Mapping
,@Setting
这个注解根据名称可以得知是定义索引相关的设置,例如在这个里面可以定义ik分词器、拼音分词器、简繁体、同义词等分词器;@Mapping
这个注解则是定义索引结构,索引有哪些字段、字段采用什么数据类型、字段如何分词、是否设置为自动补齐的字段等定义。
@Data
@Document(indexName = "post")
@Setting(settingPath = "json/post-setting.json")
@Mapping(mappingPath = "json/post-mapping.json")
public class PostIndex {
/**
* 主键
*/
private Long id;
/**
* 创建人用户名
*/
private String username;
/**
* 头像;两个用英文逗号分割
*/
private String avatar;
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* 来源; 1.cool 2.ig
*/
private Integer source;
/**
* 是否展示
*/
private Integer isShow;
/**
* 排序字段
*/
private Integer order;
/**
* ig贴文地址
*/
private String igUrl;
/**
* 创建时间
*/
private Date createTime;
/**
* 发布时间
*/
private String publishTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 创建人id(cool)
*/
private Long userid;
/**
* 投票数
*/
private Integer votes;
/**
* 投票状态
*/
private Boolean vote = false;
/**
* 标签列表
*/
private Integer privacy;
/**
* 收藏状态
*/
private Boolean collect = false;
/**
* tag标签列表
*/
@Field(searchAnalyzer = "ikSearchAnalyzer")
private List<String> tagsList;
/**
* 资源列表
*/
private List<String> resourcesList;
/**
* 创建人
*/
private String creator;
/**
* 更新人
*/
private String updater;
/**
* 0草稿、1启用、-1删除
*/
private Integer status;
/**
* 点赞数
*/
private Integer likes;
/**
* 封面图片
*/
private String img;
}
post-mapping.json
文件
{
"properties": {
"id": {
"type": "long"
},
"avatar": {
"type": "keyword"
},
"title": {
"type": "text",
"store": true,
"copy_to": "all",
"analyzer": "text_analyzer",
"search_analyzer": "ikSearchAnalyzer",
"fields": {
"suggest": {
"type": "completion",
"analyzer": "ik_max_word",
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
}
}
},
"content": {
"type": "text",
"store": true,
"copy_to": "all",
"analyzer": "text_analyzer",
"search_analyzer": "ikSearchAnalyzer",
"fields": {
"suggest": {
"type": "completion",
"analyzer": "ik_max_word",
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
}
}
},
"createTime": {
"type": "date",
"index": false,
"store": true,
"format": "date_optional_time",
"ignore_malformed": true
},
"publishTime": {
"type": "date",
"format": "yyyy-MM-dd"
},
"creator": {
"type": "keyword",
"store": true
},
"igUrl": {
"type": "keyword"
},
"isShow": {
"type": "integer",
"index": false,
"store": true
},
"resourcesList": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"img":{
"type": "keyword",
"store": true
},
"tagsList": {
"type": "completion",
"analyzer": "completion_analyzer",
"search_analyzer": "ikSearchAnalyzer"
},
"likes": {
"type": "keyword",
"store": true
},
"votes": {
"type": "keyword",
"store": true
},
"vote": {
"type": "keyword",
"store": true
},
"privacy": {
"type": "keyword",
"store": true
},
"collect": {
"type": "keyword",
"store": true
},
"order": {
"type": "keyword"
},
"postId": {
"type": "long"
},
"source": {
"type": "integer",
"index": false,
"store": true
},
"status": {
"type": "keyword",
"store": true
},
"updateTime": {
"type": "date",
"index": false,
"store": true,
"format": "date_optional_time",
"ignore_malformed": true
},
"updater": {
"type": "keyword",
"store": true
},
"userid": {
"type": "keyword"
},
"username": {
"type": "keyword",
"store": true
},
"all": {
"type": "text",
"analyzer": "text_analyzer",
"search_analyzer": "ikSearchAnalyzer",
"fields": {
"suggest": {
"type": "completion",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
}
}
post-settings.json
文件
{
"analysis": {
"analyzer": {
"text_analyzer": {
"filter": ["py"],
"tokenizer": "ik_max_word",
"char_filter": [
"tsConvert"
]
},
"completion_analyzer": {
"char_filter": [
"tsConvert"
],
"tokenizer": "ik_max_word"
},
"tsConvert": {
"tokenizer": "tsConvert"
},
"ikSearchAnalyzer": {
"type": "custom",
"tokenizer": "ik_max_word",
"char_filter": [
"tsConvert"
]
}
},
"filter": {
"py": {
"type": "pinyin",
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
},
"tsConvert": {
"convert_type": "t2s",
"type": "stconvert",
"keep_both": "false",
"delimiter": "#"
}
},
"char_filter": {
"tsConvert": {
"convert_type": "t2s",
"type": "stconvert"
}
},
"tokenizer": {
"tsConvert": {
"convert_type": "t2s",
"type": "stconvert",
"keep_both": "false",
"delimiter": "#"
}
}
}
}