SpringBoot 2.1.3統合Elasticsearch 6.4
11053 ワード
本明細書では、ESの基礎的な運用のために、主にElasticsearchTemplateとElasticsearchRepositoryクラスを継承するために使用されていない
- pom.xmlエンティティークラス インタフェース を実現ユニットテスト
- pom.xml
org.springframework.boot
spring-boot-starter-data-elasticsearch
package com.demo.es.entity;
import java.io.Serializable;
import java.time.LocalDateTime;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.format.annotation.DateTimeFormat;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
*
*
*
*
* @author Raynor
* @since 2019-03-21
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("software")
@Document(indexName = "sf", type = "software")
public class EsSoftware implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
*
*/
private String name;
/**
*
*/
private String text;
/**
*
*/
private String title;
/**
*
*/
private String type;
/**
*
*/
// private Date date;
@DateTimeFormat(pattern = "yyyy-MM-dd\'T\'HH:mm:ss.SSS")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime date;
/**
* ( User.id)
*/
private Integer userId;
/**
*
*/
private float score;
/**
*
*/
private String photo;
/**
*
*/
private String scoreLog;
}
package com.demo.respository;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
import com.demo.es.entity.EsSoftware;
@Component
public interface SoftwareRespostory extends ElasticsearchRepository {
}
package com.demo.es.service.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.lucene.search.function.CombineFunction;
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.RandomScoreFunctionBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilder;
import org.elasticsearch.index.query.functionscore.WeightBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.demo.domain.ResultInfo;
import com.demo.es.entity.EsSoftware;
import com.demo.es.service.IEsSoftwareService;
import com.demo.mapper.EsSoftwareMapper;
import com.demo.respository.SoftwareRespostory;
import com.demo.utils.StringUtils;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@com.alibaba.dubbo.config.annotation.Service(version = "${demo.service.version}", application = "${dubbo.application.id}", protocol = "${dubbo.protocol.id}", registry = "${dubbo.registry.id}", timeout = 300000)
@Service
public class EsSoftwareServiceImpl extends ServiceImpl implements IEsSoftwareService {
@Autowired
private SoftwareRespostory softwareRespostory;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
private EsSoftwareMapper softwareMapper;
//
@Override
public boolean saveAll(List list) {
softwareRespostory.deleteAll();
softwareRespostory.saveAll(list);
return true;
}
//
@Override
public List search(String searchContent) {
// String delete = elasticsearchTemplate.delete(Software.class, "41");// id
// BoolQueryBuilder bqb = QueryBuilders.boolQuery();
// bqb.should(QueryBuilders.fuzzyQuery("title", qry));
// bqb.must(QueryBuilders.termQuery("gender","male"));
NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();
QueryBuilder qb = QueryBuilders.disMaxQuery().add(QueryBuilders.fuzzyQuery("text", searchContent)) //
.add(QueryBuilders.fuzzyQuery("title", searchContent)).boost(1L);
searchQuery.withIndices("sf").withQuery(qb);
List list = elasticsearchTemplate.queryForList(searchQuery.build(), EsSoftware.class);
return list;
}
@Override
public boolean insert(EsSoftware es) {
boolean falg = false;
try {
softwareRespostory.save(es);
falg = true;
} catch (Exception e) {
e.printStackTrace();
}
return falg;
}
// , softwareId ID
@Override
public ResultInfo searchPage(Integer pageNumber, Integer pageSize, String searchContent, String softwareId)
throws JsonParseException, JsonMappingException, IOException {
// Pageable p = PageRequest.of(pageNumber, pageSize);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
SearchRequestBuilder searchRequestBuilder = elasticsearchTemplate.getClient().prepareSearch("sf");// index = sf
//
searchRequestBuilder.setFrom(pageNumber).setSize(pageSize);
// explain true ,
searchRequestBuilder.setExplain(true);
// text like
if (StringUtils.isChinese(searchContent)) {
queryBuilder.should(QueryBuilders.matchQuery("title", searchContent));
} else {
queryBuilder.should(QueryBuilders.wildcardQuery("title", "*" + searchContent.toLowerCase() + "*"));
}
FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[3];
// 1: :user_id -- Weight
ScoreFunctionBuilder scoreFunctionBuilder = new WeightBuilder();
scoreFunctionBuilder.setWeight(2);
QueryBuilder termQuery = null;
if (!"-1".equals(softwareId)) {
termQuery = QueryBuilders.termQuery("user_id", softwareMapper.selectById(softwareId).getId());
} else {
QueryWrapper qw = new QueryWrapper<>();
qw.groupBy("user_id");
qw.select("COUNT(user_id)");
qw.select("id");
termQuery = QueryBuilders.termQuery("user_id", softwareMapper.selectList(qw).get(0).getId());
}
FunctionScoreQueryBuilder.FilterFunctionBuilder category = new FunctionScoreQueryBuilder.FilterFunctionBuilder(
termQuery, scoreFunctionBuilder);
filterFunctionBuilders[0] = category;
// 2: -- FieldValueFactor
ScoreFunctionBuilder fieldValueScoreFunction = new FieldValueFactorFunctionBuilder(
"score");
((FieldValueFactorFunctionBuilder) fieldValueScoreFunction).factor(1.1f);
FunctionScoreQueryBuilder.FilterFunctionBuilder sales = new FunctionScoreQueryBuilder.FilterFunctionBuilder(
fieldValueScoreFunction);
filterFunctionBuilders[1] = sales;
// : --random_score
ScoreFunctionBuilder randomScoreFilter = new RandomScoreFunctionBuilder();
((RandomScoreFunctionBuilder) randomScoreFilter).seed(2);
FunctionScoreQueryBuilder.FilterFunctionBuilder random = new FunctionScoreQueryBuilder.FilterFunctionBuilder(
randomScoreFilter);
filterFunctionBuilders[2] = random;
// FunctionScore
FunctionScoreQueryBuilder query = QueryBuilders.functionScoreQuery(queryBuilder, filterFunctionBuilders)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.SUM);
searchRequestBuilder.setQuery(query);
SearchResponse response = searchRequestBuilder.execute().actionGet();
SearchHits hits = response.getHits();
String searchSource;
List l = new ArrayList();
for (SearchHit hit : hits) {
searchSource = hit.getSourceAsString();
ObjectMapper mapper = new ObjectMapper();
// EsSoftware es =JSONObject.parseObject(searchSource, EsSoftware.class);//Json JavaBean
EsSoftware es = mapper.readValue(searchSource, EsSoftware.class);
l.add(es);
}
long total = hits.getTotalHits();
return new ResultInfo(total, l);
}
@Override
public void delete(EsSoftware entity) {
softwareRespostory.delete(entity);
}
}
package com.demo;
import java.io.IOException;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.demo.domain.ResultInfo;
import com.demo.es.entity.EsSoftware;
import com.demo.es.service.IEsSoftwareService;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SearchApplicationTests {
@Autowired
IEsSoftwareService i;
@Test
public void contextLoads() throws JsonParseException, JsonMappingException, IOException {
ResultInfo r = i.searchPage(0, 10, " IDM 6 ", "-1");
@SuppressWarnings({ "unchecked" })
List l = (List) r.getRows();
for (EsSoftware es : l) {
System.out.println(es.getId()+"xxx");
}
}
}