安装 elasticsearch
# elasticsearch kibana ik pinyin版本要一致
docker pull elasticsearch:7.10.0
docker run --name elasticsearch -p 9200:9200 \
-p 9300:9300 \
# 指定编码
-e LANG=C.UTF-8 \
-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配置
# 进入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
安装插件 ik + pinyin分词器
分词器在 docker中安装没有config文件,配置不了IK分词器的扩展词汇,建议手动下载复制到服务器中.
https://github.com/medcl/elasticsearch-analysis-ik/releases
## 分词器的版本一定要与 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
ik分词器的扩展词汇
docker 容器运行时要指定编码,在容器中中文字符会乱码
# 进入容器后通过此命令查看容器当前字符编码
locale
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
安装Kibana
# 安装kibana
docker pull kibana:7.10.0
# 运行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",
"search_analyzer": "ik_smart",
"fields" : {
"pinyin" : {
"type" : "text",
"term_vector" : "with_positions_offsets",
"analyzer" : "pinyin_analyzer"
}
}
},
"columnName" : {
"type" : "text",
"analyzer" : "ik_max_word",
"search_analyzer": "ik_smart",
"fields" : {
"pinyin" : {
"type" : "text",
"term_vector" : "with_positions_offsets",
"analyzer" : "pinyin_analyzer"
}
}
}
}
}
## 测试分词
GET _analyze
{
"analyzer": "ik_max_word",
"text": "绘画艺术"
}
# ElasticSearch中analyzer和search_analyzer的区别
https://blog.youkuaiyun.com/weixin_42638762/article/details/124546259
springBoot xml配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
实体类
//@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;
/**
* 课程栏目名称
*/
private String name;
/**
* 课程科目
@Field(type = FieldType.Text,analyzer = "pinyin_analyzer",searchAnalyzer = "pinyin_analyzer")
注解与mapping不能同时配置
*/
private String columnName;
/**
* 年龄标签
*/
private String age;
/**
* 难度等级
*/
private String difficulty;
}
检索方法
/**
* 中文、拼音混合搜索
*
* @param keyword the content
* @return dis max query builder
*/
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<Integer,String> getSearchNames(String keyword) {
if (StringUtils.isBlank(keyword)) {
return new HashMap<>();
}
NativeSearchQueryBuilder nativeSearchQueryBuilder = structureQuery(keyword);
NativeSearchQuery query = nativeSearchQueryBuilder.build();
Iterable<EsCourseProductCategory> search = esCourseProductCategoryRepository.search(query).getContent();
Iterator<EsCourseProductCategory> iterator = search.iterator();
Map<Integer,String> 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;
}
问题总结
- 版本问题
- ik分词器容器内安装没有 config文件夹
- docker 运行不指定字符编码,中文乱码问题
- 搜索字段 analyzer和search_analyzer https://blog.youkuaiyun.com/weixin_42638762/article/details/124546259