一、elasticsearch官網(wǎng)下載:Elasticsearch 7.16.1 | Elastic
二、拼音、ik、繁簡體轉(zhuǎn)換插件安裝
ik分詞:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.
拼音分詞:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin.
繁簡體轉(zhuǎn)換:GitHub - medcl/elasticsearch-analysis-stconvert: STConvert is analyzer that convert chinese characters between traditional and simplified.中文簡繁體互相轉(zhuǎn)換.
安裝過程:從github上下載源碼到本地,idea打開項(xiàng)目,修改對應(yīng)項(xiàng)目中的pom.xml將
<elasticsearch.version>7.16.1</elasticsearch.version>修改為對應(yīng)的elasticsearch版本
,alt+f12打開cmd命令界面,輸入mvn install,項(xiàng)目編譯成功后會在對應(yīng)目錄中生成對應(yīng)zip包,效果如圖:
將對應(yīng)zip包解壓到elasticsearch存放目錄的plugins下:
重新給把lasticsearch的文件權(quán)限給用戶elastic?
chown -R elastic /usr/local/elasticsearch-7.16.1/
不然報(bào)權(quán)限的錯(cuò)誤哦
然后啟動elasticsearch.bat,
這樣對應(yīng)插件就算安裝成功了
三. mvn,及yml配置
<elasticsearch.version>7.16.1</elasticsearch.version>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>x-pack-sql-jdbc</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
# ElasticSearch 7設(shè)置
elasticsearch:
schema: http
host: 123.456
port: 9200
userName: es
password:3333
indexes: index
四. es工具類
此次在原來的基礎(chǔ)上主要是加了創(chuàng)建索引時(shí)可選則索引庫的默認(rèn)分詞器類型,可選pinyin
CreateIndexRequest request = new CreateIndexRequest(indexName); request.settings(Settings.builder() //.put("analysis.analyzer.default.type", "ik_max_word") //.put("analysis.analyzer.default.type", "pinyin")//同時(shí)支持拼音和文字 .put("analysis.analyzer.default.type", indexType)
import com.alibaba.fastjson.JSON;
import io.micrometer.core.instrument.util.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author ylwang
* @create 2021/7/27 9:16
*/
@Configuration
public class ElasticSearchClientConfig {
/**
* 協(xié)議
*/
@Value("${jeecg.elasticsearch.schema}")
private String schema;
/**
* 用戶名
*/
@Value("${jeecg.elasticsearch.userName}")
private String userName;
/**
* 密碼
*/
@Value("${jeecg.elasticsearch.password}")
private String password;
/**
* 地址
*/
@Value("${jeecg.elasticsearch.host}")
private String host;
/**
* 地址
*/
@Value("${jeecg.elasticsearch.port}")
private String port;
public final String AIOPENQAQINDEXNAME = "aiopenqaq"; //ai問題庫索引名
public final String AIYunLiao = "aiyunliao"; //ai語料庫索引名
public final String KNOWLEDGE = "knowledge";//知識庫索引名
public static RestHighLevelClient restHighLevelClient;
@Bean
public RestHighLevelClient restHighLevelClient() {
restHighLevelClient = new RestHighLevelClient(RestClient.builder(
new HttpHost(host, Integer.parseInt(port), schema)));
//驗(yàn)證用戶密碼
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));
RestClientBuilder restClientBuilder = RestClient
.builder(new HttpHost(host, Integer.parseInt(port), schema))
.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
return httpClientBuilder;
})
.setRequestConfigCallback(requestConfigBuilder -> {
return requestConfigBuilder;
});
restHighLevelClient = new RestHighLevelClient(restClientBuilder);
return restHighLevelClient;
}
/**
* 判斷索引是否存在
* @return 返回是否存在。
* <ul>
* <li>true:存在</li>
* <li>false:不存在</li>
* </ul>
*/
public boolean existIndex(String index){
GetIndexRequest request = new GetIndexRequest();
request.indices(index);
boolean exists;
try {
exists = restHighLevelClient().indices().exists(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
return false;
}
return exists;
}
/**
* 查詢并分頁
* @param indexName 索引名字
* @param from 從第幾條開始查詢,相當(dāng)于 limit a,b 中的a ,比如要從最開始第一條查,可傳入: 0
* @param size 本次查詢最大查詢出多少條數(shù)據(jù) ,相當(dāng)于 limit a,b 中的b
* @return {@link SearchResponse} 結(jié)果,可以通過 response.status().getStatus() == 200 來判斷是否執(zhí)行成功
*獲取總條數(shù)的方法
* TotalHits totalHits = searchResponse.getHits().getTotalHits();
*
*/
public SearchResponse search(String indexName, SearchSourceBuilder searchSourceBuilder, Integer from, Integer size){
SearchRequest request = new SearchRequest(indexName);
searchSourceBuilder.from(from);
searchSourceBuilder.size(size);
request.source(searchSourceBuilder);
SearchResponse response = null;
try {
response = restHighLevelClient().search(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
/**
* 根據(jù)索引中的id查詢
* @param indexName
* @param id
* @return
*/
public String searchById(String indexName,String id){
SearchRequest request = new SearchRequest(indexName);
request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("_id",id)));
SearchResponse response = null;
try {
response = restHighLevelClient().search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
SearchHit[] hits1 = hits.getHits();
for (SearchHit fields : hits1) {
return fields.getSourceAsString();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 創(chuàng)建索引
*
* @param indexName 要?jiǎng)?chuàng)建的索引的名字,傳入如: testindex
* @param indexType 索引類型 : ik_max_word 和 pinyin
* @return 創(chuàng)建索引的響應(yīng)對象??梢允褂?{@link CreateIndexResponse#isAcknowledged()} 來判斷是否創(chuàng)建成功。如果為true,則是創(chuàng)建成功
*/
public CreateIndexResponse createIndex(String indexName,String indexType) {
CreateIndexResponse response=null;
if(existIndex(indexName)){
response = new CreateIndexResponse(false, false, indexName);
return response;
}
if(StringUtils.isBlank(indexType)){
indexType="ik_max_word";
}
CreateIndexRequest request = new CreateIndexRequest(indexName);
request.settings(Settings.builder()
//.put("analysis.analyzer.default.type", "ik_max_word")
//.put("analysis.analyzer.default.type", "pinyin")//同時(shí)支持拼音和文字
.put("analysis.analyzer.default.type", indexType)
);
try {
response = restHighLevelClient().indices().create(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
/**
* 數(shù)據(jù)添加,網(wǎng) elasticsearch 中添加一條數(shù)據(jù)
* @param params 要增加的數(shù)據(jù),key-value形式。 其中map.value 支持的類型有 String、int、long、float、double、boolean
* @param indexName 索引名字,類似數(shù)據(jù)庫的表,是添加進(jìn)那個(gè)表
* @param id 要添加的這條數(shù)據(jù)的id, 如果傳入null,則由es系統(tǒng)自動生成一個(gè)唯一ID
* @return 創(chuàng)建結(jié)果。如果 {@link IndexResponse#getId()} 不為null、且id長度大于0,那么就成功了
*/
public IndexResponse put(String params, String indexName, String id){
//創(chuàng)建請求
IndexRequest request = new IndexRequest(indexName);
if(id != null){
request.id(id);
}
request.timeout(TimeValue.timeValueSeconds(5));
IndexResponse response = null;
try {
response = restHighLevelClient().index(request.source(params, XContentType.JSON).setRefreshPolicy("wait_for"), RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
/**
* 數(shù)據(jù)更新
* @param params 要更新 的數(shù)據(jù),key-value形式。 其中map.value 支持的類型有 String、int、long、float、double、boolean
* @param indexName 索引名字,類似數(shù)據(jù)庫的表,是添加進(jìn)那個(gè)表
* @param id 要添加的這條數(shù)據(jù)的id, 如果傳入null,則由es系統(tǒng)自動生成一個(gè)唯一ID
* @return 創(chuàng)建結(jié)果。如果 {@link IndexResponse#getId()} 不為null、且id長度大于0,那么就成功了
*/
public UpdateResponse update(String params, String indexName, String id){
//創(chuàng)建請求
UpdateRequest request = new UpdateRequest(indexName,id);
request = request.doc(params, XContentType.JSON);
request.setRefreshPolicy("wait_for");
request.timeout(TimeValue.timeValueSeconds(5));
UpdateResponse response = null;
try {
response = restHighLevelClient().update(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
/**
* 刪除索引
* @param indexName
* @throws IOException
*/
public AcknowledgedResponse deleteIndex(String indexName) {
DeleteIndexRequest request = new DeleteIndexRequest(indexName);
AcknowledgedResponse response = null;
try {
response = restHighLevelClient().indices().delete(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(response.isAcknowledged());
return response;
}
/**
* 通過elasticsearch數(shù)據(jù)的id,來刪除這條數(shù)據(jù)
* @param indexName 索引名字
* @param id 要?jiǎng)h除的elasticsearch這行數(shù)據(jù)的id
*/
public boolean deleteById(String indexName, String id) {
DeleteRequest request = new DeleteRequest(indexName, id);
request.setRefreshPolicy("wait_for");
DeleteResponse delete = null;
try {
delete = restHighLevelClient().delete(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
//刪除失敗
return false;
}
if(delete == null){
//這種情況應(yīng)該不存在
return false;
}
if(delete.getResult().equals(DocWriteResponse.Result.DELETED)){
return true;
}else{
return false;
}
}
}
查詢由must改成should,
@Override
public Result<?> queryPageList(AiOpenqaQ aiOpenqaQ, HttpServletRequest req, Integer pageNo, Integer pageSize) {
// es.deleteIndex(es.AIOPENQAQINDEXNAME);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.termQuery("topId",aiOpenqaQ.getTopId()));
boolQueryBuilder.should(QueryBuilders.termQuery("tagId",aiOpenqaQ.getTagId()));
searchSourceBuilder.query(boolQueryBuilder);
SearchResponse search = es.search(es.AIOPENQAQINDEXNAME, searchSourceBuilder, pageNo == 1 || pageNo == 0 ? 0 : (pageNo -1) * pageSize, pageSize);
SearchHits hits = search.getHits();
List<AiOpenqaQ> list = new ArrayList<>();
for (SearchHit hit : hits) {
AiOpenqaQ aiOpenqaQ1 = JSON.parseObject(hit.getSourceAsString(), AiOpenqaQ.class);
list.add(aiOpenqaQ1);
}
Page<AiOpenqaQ> page = new Page<>(pageNo,pageSize);
page.setRecords(list);
page.setTotal(search.getHits().getTotalHits().value);
return Result.ok(page);
}
五,創(chuàng)建索引,插入數(shù)據(jù)
@Resource
private ElasticSearchClientConfig es;
@Resource
private AiOpenqaQMapper aiOpenqaQMapper;
@Override
public int selectNums(String applicationId) {
return aiOpenqaQMapper.selectNums(applicationId);
}
@Override
public boolean saveAndEs(AiOpenqaQ aiOpenqaQ) {
// es.deleteIndex(es.AIOPENQAQINDEXNAME);
boolean save = this.save(aiOpenqaQ);
if(save){
if(!es.existIndex(es.AIOPENQAQINDEXNAME)){
es.createIndex(es.AIOPENQAQINDEXNAME,"pinyin");
}
es.put(JsonMapper.toJsonString(aiOpenqaQ), es.AIOPENQAQINDEXNAME,aiOpenqaQ.getId());
}
return true;
}
}
六,驗(yàn)證
同音詞查詢
直接拼音文章來源:http://www.zghlxwxcb.cn/news/detail-814827.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-814827.html
到了這里,關(guān)于ElasticSearch 學(xué)習(xí)9 spring-boot ,elasticsearch7.16.1實(shí)現(xiàn)中文拼音分詞搜索的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!