一.安装
1.安装完es之后需要在安装一个【可视化界面head】插件,但在连接时会有跨域问题需要配置:
http.cors.enabled: true
http.cors.allow-origin: "*"
2.使用IK分词器对于自己需要的词可以将其加入分词器词典中,ik 分词器增加自己的配置:
三.linux启动
- linux不允许root启动
groupadd esgroup
useradd esuser -g esgroup -p esuser
chown esuser:esgroup -R /usr/local/elastic6_8_3/elasticsearch-6.8.3
su esuser #切换用户 - 后台启动
./elasticsearch -d
三.简单使用
@Configuration
public class ElasticsearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")));
return client;
}
}
public class EsUtil {
private RestHighLevelClient client;
public EsUtil(RestHighLevelClient highLevelClient) {
this.client = highLevelClient;
}
/**
* 创建索引
* @param indexName
*/
public void addIndex(String indexName) throws IOException {
boolean b = existsIndex(indexName);
if(!b){//不存在创建
CreateIndexRequest request = new CreateIndexRequest(indexName);
String queryMappingStr = getQueryMappingStr();
request.mapping(queryMappingStr,XContentType.JSON);
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
}
/**
* 判断索引名是否存在
* @param indexName
* @return
*/
public boolean existsIndex(String indexName) {
try{
GetIndexRequest request = new GetIndexRequest(indexName);
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
return exists;
}catch (Exception e){
System.out.println("Exception");
}
return false;
}
/**
* @param : client
* @description : 判断文档是否存在
*/
public boolean isExist(String indexName, String indexId) throws IOException{
GetRequest request = new GetRequest(indexName,indexId);
//1.同步判断
boolean exists = client.exists(request, RequestOptions.DEFAULT);
//2.异步判断
/* ActionListener<Boolean> listener = new ActionListener<Boolean>() {
@Override
public void onResponse(Boolean exists) {
if (exists){
System.out.println("文档存在");
}else {
System.out.println("文档不存在");
}
}
@Override
public void onFailure(Exception e) {
}
};*/
/*client.existsAsync(request, RequestOptions.DEFAULT, listener);*/
return exists;
}
/**
* @param : client
* @description : 删除文档
*/
public static void deleteDocument(RestHighLevelClient restHighLevelClient, String indexName, String typeName, String indexId) throws IOException{
DeleteRequest request = new DeleteRequest(indexName,typeName,indexId);
//设置请求超时时间:2分钟
request.timeout(TimeValue.timeValueMinutes(2));
//request.timeout("2m");
//同步删除
DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
//异步删除
ActionListener<DeleteResponse> listener = new ActionListener<DeleteResponse>() {
@Override
public void onResponse(DeleteResponse deleteResponse) {
System.out.println("删除后操作");
}
@Override
public void onFailure(Exception e) {
System.out.println("删除失败");
}
};
// Cancellable cancellable = restHighLevelClient.deleteAsync(request, RequestOptions.DEFAULT, listener);
}
/**
* 批量增加数据的方法
* @param indexname
* @param list
* @throws Exception
*/
public void bulkadd( String indexname,List list) throws Exception {
//批量导入数据
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
for (int i = 0 ; i < list.size() ; i++) {
bulkRequest.add(
new IndexRequest(indexname)
.id(""+(i+1))
.source(JSON.toJSONString(list.get(i)),XContentType.JSON)
);
}
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());//是否失败 false->成功
}
public List<Map<String,Object>> searchPageHighlight(String indexName,String keyWord,int pageNo,int pageSize) throws IOException {
List<Map<String,Object>> list = new ArrayList<>();
if (pageNo<=1){
pageNo = 1;
}
//条件搜索
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//分页
sourceBuilder.from(pageNo);
sourceBuilder.size(pageSize);
//精准匹配关键字
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyWord);
sourceBuilder.query(termQueryBuilder);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
//高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("title");
highlightBuilder.requireFieldMatch(true);//多个高亮显示设置为false
highlightBuilder.preTags("<span style='color:red'>");
highlightBuilder.postTags("</span>");
sourceBuilder.highlighter(highlightBuilder);
//执行搜索
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit documentFields : hits) {
Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();
HighlightField highlightField = highlightFields.get("title");
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
if (highlightField!=null){
Text[] texts = highlightField.getFragments();
//高亮的title
String n_title = "";
for (Text text : texts) {
n_title+=text;
}
sourceAsMap.put("title",n_title);
}
list.add(sourceAsMap);
}
return list;
}
/**
* 建立映射
*/
private String getQueryMappingStr(){
StringBuilder source = new StringBuilder();
source.append("{\"properties\":{")
.append("\"modelId\":{\"type\":\"text\"}")
.append(",\"yearPattern\":{\"type\":\"text\",\"analyzer\":\"ik_smart\"}")
.append(",\"brandName\":{\"type\":\"text\",\"analyzer\":\"ik_max_word\"}")
.append(",\"brandId\":{\"type\":\"text\"}")
.append(",\"brandCode\":{\"type\":\"text\"}")
.append("}}");
return source.toString();
}
}