使用springboot整合elasticsearch时候,需要注意版本的对应关系,不然问题会非常多,对应关系如下:
springboot2.1整合 elasticsearch的两个方式:通过spring-data-es(springboot 2.2版本以后使用http形式操作,使用端口9200,springboot 2.1使用tcp形式访问es,使用端口9300)、使用 RestHighLevelClient 方式
使用RestHighLevelClient 方式,官方建议restHighLevelClient,比较灵活使用
使用springboot 2.1x,es使用6.3
1.maven配置
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.2.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.4</version>
</dependency>
2.配置文件,端口为9200
elasticsearch:
ip: 192.168.1.84:9200
username: elastic
password: Gdfllll
3.创建索引,自定义索引分词器,基于业务的需要这里我自定义了两个分词器,一个空格转小写分词器,一个结巴中文分词器
PUT /news_tag_zh
{
"settings":{
"analysis":{
"analyzer":{
"my_lowercase_analyzer":{
"type":"custom",
"tokenizer":"whitespace",
"filter":[
"lowercase"
]
},
"my_zh_analyzer":{
"type":"custom",
"tokenizer":"ik_smart",
"filter":[
"lowercase"
]
}
}
}
},
"mappings":{
"news_tag":{
"properties":{
"newsId":{
"type":"long"
},
"newsType":{
"type":"integer"
},
"lang":{
"type":"integer"
},
"sourceType":{
"type":"integer"
},
"tagTime":{
"type":"integer"
},
"authorId":{
"type":"long"
},
"isOriginal":{
"type":"boolean"
},
"isToday":{
"type":"boolean"
},
"specialId":{
"type": "integer"
},
"isSelection":{
"type":"boolean"
},
"keyWordList":{
"type":"text",
"analyzer":"my_lowercase_analyzer"
},
"tagLv1List":{
"type":"text",
"analyzer":"my_lowercase_analyzer",
"fielddata": true
},
"tagLv2List":{
"type":"text",
"analyzer":"my_lowercase_analyzer",
"fielddata": true
},
"contentTagList":{
"type":"text",
"analyzer":"my_lowercase_analyzer"
},
"areaList":{
"type":"text",
"analyzer":"my_lowercase_analyzer"
},
"title":{
"type":"text",
"analyzer":"my_zh_analyzer"
},
"updateTime":{
"type":"long"
},
"releaseTime":{
"type":"long"
},
"endTime":{
"type":"long"
}
}
}
}
}
4.Es配置类
ElasticSearchConfiguration配置文件
@Configuration
public class ElasticSearchConfiguration extends AbstractFactoryBean {
private static final Logger LOG = LoggerFactory.getLogger(ElasticSearchConfiguration.class);
private static final int ADDRESS_LENGTH = 2;
private static final String HTTP_SCHEME = "http";
/**
* 使用冒号隔开ip和端口1
*/
@Value("${elasticsearch.ip}")
String[] ipAddress;
@Value("${elasticsearch.username}")
String username;
@Value("${elasticsearch.password}")
String password;
private RestHighLevelClient restHighLevelClient;
@Override
public void destroy() throws Exception {
// 关闭Client
if (restHighLevelClient != null) {
restHighLevelClient.close();
}
}
@Override
public Class<RestHighLevelClient> getObjectType() {
return RestHighLevelClient.class;
}
@Override
public boolean isSingleton() {
return false;
}
@Override
protected Object createInstance() throws Exception {
try {