SpringBoot 2.1.3統合Elasticsearch 6.4


本明細書では、ESの基礎的な運用のために、主にElasticsearchTemplateとElasticsearchRepositoryクラスを継承するために使用されていない
- 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");
    		}
    	}
    
    }