-
docker 安装 elasticsearch、kibana、ik分词器
# elasticsearch kibana 版本要一致 docker pull elasticsearch docker pull kibana #运行elasticsearch docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms4g -Xmx4g" -v /usr/local/data-docker/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /usr/local/data-docker/elasticsearch/data:/usr/share/elasticsearch/data -v /usr/local/data-docker/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d 37190fe5beea # 进入elasticsearch 容器 docker exec -it -u root elasticsearch /bin/bash # 修改配置文件 vi config/elasticsearch.yml #########################添加配置################################### xpack.security.enabled: true xpack.security.transport.ssl.enabled: true # 退出容器,重启elasticsearch exit docker restart elasticsearch # 安装的elasticsearch是没有密码 生成一个密码 docker exec -it -u root elasticsearch /bin/bash ./bin/elasticsearch-setup-passwords -h # 保存生成的密码 ./bin/elasticsearch-setup-passwords auto ## 分词器的版本一定要与 elasticsearch一致 # 下载插件 拼音分词 https://github.com/medcl/elasticsearch-analysis-pinyin/releases ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.8.0/elasticsearch-analysis-pinyin-7.8.0.zip ## 分词器的版本一定要与 elasticsearch一致 # 下载 中文分词 https://github.com/medcl/elasticsearch-analysis-ik/releases ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.8.0/elasticsearch-analysis-ik-v7.8.0.zip # 运行kibana docker run -d -it --restart=always --privileged=true --name=kibana -e ELASTICSEARCH_HOSTS=http://localhost:9200 -p 5601:5601 -v/home/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.ym eadc7b3d59dd # 进入kibana容器 docker exec -it -u root kibana /bin/bash # 修改配置 vi config/kibana.yml #########################配置################################### server.name: kibana # kibana的主机地址 0.0.0.0可表示监听所有IP server.host: "0.0.0.0" # kibana访问es的URL elasticsearch.hosts: [ "http://127.0.0.1:9200" ] elasticsearch.username: 'kibana_system' elasticsearch.password: '生成好的密码' # 显示登陆页面 xpack.monitoring.ui.container.elasticsearch.enabled: true # 语言 i18n.locale: "zh-CN" ##重启容器 docker restart kibana
-
访问kibana
找到开发工具菜单
# 创建索引
PUT /course_product_category/
{
"settings":{
"number_of_shards": 3,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"default":{
"tokenizer":"ik_max_word"
},
"pinyin_analyzer": {
"type": "custom",
"tokenizer": "my_pinyin",
"filter": ["word_delimiter"]
}
},
"tokenizer": {
"my_pinyin" : {
"type" : "pinyin",
"keep_first_letter":true,
"keep_separate_first_letter" : true,
"keep_full_pinyin" : true,
"keep_original" : true,
"limit_first_letter_length" : 16,
"lowercase" : true
}
}
}
}
}
# 配置索引 mapping
PUT /course_product_category/_mapping/category?include_type_name=true
{
"properties" : {
"name" : {
"type" : "text",
"analyzer" : "ik_max_word",
"fields" : {
"pinyin" : {
"type" : "text",
"term_vector" : "with_positions_offsets",
"analyzer" : "pinyin_analyzer"
}
}
},
"columnName" : {
"type" : "text",
"analyzer" : "ik_max_word",
"fields" : {
"pinyin" : {
"type" : "text",
"term_vector" : "with_positions_offsets",
"analyzer" : "pinyin_analyzer"
}
}
}
}
}
- 主要代码
org.springframework.boot spring-boot-starter-data-elasticsearch org.elasticsearch.client elasticsearch-rest-high-level-client
//@Mapping(mappingPath = "elasticsearch_mapping.json")//设置mapping
//@Setting(settingPath = "elasticsearch_setting.json")//设置setting
@Data
@EqualsAndHashCode(callSuper = false)
@Document(indexName = "course_product_category",type = "category",shards = 1,replicas = 0)
public class EsCourseProductCategory implements Serializable {
private static final long serialVersionUID = 3191530395115676563L;
@Id
private Integer id;
@Field(type = FieldType.Text,analyzer = "pinyin_analyzer",searchAnalyzer = "pinyin_analyzer")
private String name;
@Field(type = FieldType.Text,analyzer = "pinyin_analyzer",searchAnalyzer = "pinyin_analyzer")
private String columnName;
@Field(type = FieldType.Keyword)
private String age;
@Field(type = FieldType.Keyword)
private String difficulty;
}
public NativeSearchQueryBuilder structureQuery(String keyword) {
DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery();
MatchQueryBuilder title = QueryBuilders.matchQuery("name", keyword);
MatchQueryBuilder content = QueryBuilders.matchQuery("columnName", keyword);
MatchQueryBuilder pinyContent = QueryBuilders.matchQuery("name.pinyin", keyword);
MatchQueryBuilder pinyTitle = QueryBuilders.matchQuery("columnName.pinyin", keyword);
disMaxQuery.add(title);
disMaxQuery.add(content);
disMaxQuery.add(pinyContent);
disMaxQuery.add(pinyTitle);
return new NativeSearchQueryBuilder()
.withQuery(disMaxQuery).withSort(SortBuilders.scoreSort().order(SortOrder.DESC));
}
public Map getSearchNames(String keyword) {
if (StringUtils.isBlank(keyword)) {
return new HashMap<>();
}
NativeSearchQueryBuilder nativeSearchQueryBuilder = structureQuery(keyword);
NativeSearchQuery query = nativeSearchQueryBuilder.build();
Iterable search = esCourseProductCategoryRepository.search(query).getContent();
Iterator iterator = search.iterator();
Map result = new HashMap<>();
while (iterator.hasNext()) {
EsCourseProductCategory next = iterator.next();
result.put(next.getId(),StringUtils.isNotEmpty(next.getColumnName()) ? next.getColumnName() + "-" + next.getName() : next.getName());
}
return result;
}



