SpringBoot+Elasticsearch+ik

安装 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.csdn.net/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;
    }
问题总结
  1. 版本问题
  2. ik分词器容器内安装没有 config文件夹
  3. docker 运行不指定字符编码,中文乱码问题
  4. 搜索字段 analyzer和search_analyzer https://blog.csdn.net/weixin_42638762/article/details/124546259
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值