项目作者: aillamsun

项目描述 :
spring-boot-elastcsearch-example
高级语言: Java
项目地址: git://github.com/aillamsun/spring-boot-elastcsearch-example.git
创建时间: 2017-05-19T01:27:24Z
项目社区:https://github.com/aillamsun/spring-boot-elastcsearch-example

开源协议:Apache License 2.0

下载


spring-boot-elastcsearch-example.


技术

Spring Boot(1.5.1.RELEASE) elastcsearch-2.4.1


更新

  1. public boolean insertOrUpdate(GoodsESDoc goodsESDoc) {
  2. List<IndexQuery> queries = new ArrayList<IndexQuery>();
  3. Long id = goodsESDoc.getId();
  4. IndexQuery indexQuery = new IndexQueryBuilder().withId(String.valueOf(id)).withObject(goodsESDoc).build();
  5. queries.add(indexQuery);
  6. elasticsearchTemplate.bulkIndex(queries);
  7. elasticsearchTemplate.refresh(GoodsESDoc.class);
  8. return true;
  9. }

删除

  1. public void deleteById(Long id) {
  2. goodsESDocRepository.delete(id);
  3. }

分页条件DSL查询 (支持高亮)

  1. /**
  2. * 条件查询
  3. *
  4. * @param filedContentMap 条件
  5. * @param heightFields 高亮字段 不需要设置为null
  6. * @param sortFields 排序字段
  7. * @param order 排序类型
  8. * @param basePage 分页
  9. * @return
  10. */
  11. public BasePage<GoodsModel> queryPage(Map<String, Object> filedContentMap, final List<String> heightFields, String[] sortFields, String order, BasePage<GoodsModel> basePage, String[] resultFields) {
  12. HighlightBuilder.Field[] hfields = new HighlightBuilder.Field[0];
  13. if (heightFields != null) {
  14. hfields = new HighlightBuilder.Field[heightFields.size()];
  15. for (int i = 0; i < heightFields.size(); i++) {
  16. hfields[i] = new HighlightBuilder.Field(heightFields.get(i)).preTags("<em style='color:red'>").postTags("</em>").fragmentSize(250);
  17. }
  18. }
  19. NativeSearchQueryBuilder nsb = new NativeSearchQueryBuilder().withHighlightFields(hfields);//高亮字段
  20. if (basePage != null) {//分页
  21. nsb.withPageable(new PageRequest(basePage.getPageNo() - 1, basePage.getPageSize()));
  22. }
  23. BoolQueryBuilder qb = QueryBuilders.boolQuery();
  24. for (String key : filedContentMap.keySet()) {//字段查询
  25. // and
  26. qb.must(QueryBuilders.matchQuery(key, filedContentMap.get(key)));
  27. // or
  28. if ("description".equals(key)) {
  29. qb.should(QueryBuilders.matchQuery(key, filedContentMap.get(key)));
  30. }
  31. }
  32. //模糊查询
  33. // qb.must( QueryBuilders.fuzzyQuery("",1).boost(0.5F));
  34. nsb.withQuery(qb);
  35. SearchQuery searchQuery = nsb.build();//查询建立
  36. searchQuery.addFields(resultFields);
  37. if (sortFields != null && sortFields.length > 0 && order != null) {//排序
  38. // nsb.withSort(new FieldSortBuilder(sortField).ignoreUnmapped(true).order(order));
  39. // searchQuery.addSort()
  40. if ("desc".equals(order)) {//降序
  41. searchQuery.addSort(new Sort(Sort.Direction.DESC, sortFields));
  42. }
  43. if ("asc".equals(order)) {//升序
  44. searchQuery.addSort(new Sort(Sort.Direction.ASC, sortFields));
  45. }
  46. }
  47. Page<GoodsModel> page = null;
  48. //如果设置高亮
  49. if (heightFields != null && heightFields.size() > 0) {
  50. page = elasticsearchTemplate.queryForPage(searchQuery, GoodsModel.class, new SearchResultMapper() {
  51. @SuppressWarnings("unchecked")
  52. @Override
  53. public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
  54. List<T> chunk = new ArrayList<T>();
  55. for (SearchHit searchHit : response.getHits()) {
  56. if (response.getHits().getHits().length <= 0) {
  57. return null;
  58. }
  59. Map<String, Object> entityMap = searchHit.getSource();
  60. for (String highName : heightFields) {
  61. Text text[] = searchHit.getHighlightFields().get(highName).fragments();
  62. if (text.length > 0) {
  63. String highValue = searchHit.getHighlightFields().get(highName).fragments()[0].toString();
  64. entityMap.put(highName, highValue);
  65. }
  66. }
  67. chunk.add((T) PropertyHelper.getFansheObj(GoodsModel.class, entityMap));
  68. }
  69. if (chunk.size() > 0) {
  70. return new AggregatedPageImpl<T>((List<T>) chunk);
  71. }
  72. return new AggregatedPageImpl<T>(new ArrayList<T>());
  73. }
  74. });
  75. } else {//如果不设置高亮
  76. logger.info("#################" + qb.toString());
  77. page = elasticsearchTemplate.queryForPage(searchQuery, GoodsModel.class);
  78. }
  79. basePage.setTotalRecord(page.getTotalElements());
  80. basePage.setResults(page.getContent());
  81. return basePage;
  82. }

function_score 权重查询

  1. /**
  2. *
  3. *
  4. *
  5. * @param pageNumber
  6. * @param pageSize
  7. * @param searchContent
  8. * @return
  9. */
  10. public List<GoodsModel> searchGoods(Integer pageNumber,
  11. Integer pageSize,
  12. String searchContent) {
  13. // 分页参数
  14. Pageable pageable = new PageRequest(pageNumber, pageSize);
  15. // Function Score Query
  16. FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
  17. .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("goodsName", searchContent)),ScoreFunctionBuilders.weightFactorFunction(1000))
  18. .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("description", searchContent)),ScoreFunctionBuilders.weightFactorFunction(1000));
  19. // 创建搜索 DSL 查询
  20. SearchQuery searchQuery = new NativeSearchQueryBuilder()
  21. .withPageable(pageable)
  22. .withQuery(functionScoreQueryBuilder).build();
  23. logger.info("\n searchGoods(): searchContent [" + searchContent + "] \n DSL = \n " + searchQuery.getQuery().toString());
  24. Page<GoodsModel> searchPageResults = goodsESDocRepository.search(searchQuery);
  25. return searchPageResults.getContent();
  26. }

Test Code

  1. @Before
  2. public void before() {
  3. elasticsearchTemplate.deleteIndex(GoodsModel.class);
  4. elasticsearchTemplate.createIndex(GoodsModel.class);
  5. elasticsearchTemplate.putMapping(GoodsModel.class);
  6. initData();
  7. elasticsearchTemplate.refresh(GoodsModel.class);
  8. }
  9. public void initData() {
  10. GoodsModel goodsESDoc = new GoodsModel();
  11. goodsESDoc.setId(1L);
  12. goodsESDoc.setGoodsId(1L);
  13. goodsESDoc.setGoodsCode("1");
  14. goodsESDoc.setGoodsName("百事可乐拉罐");
  15. goodsESDoc.setDescription("百事可乐拉罐");
  16. goodsESDoc.setPrice(2d);
  17. goodsESDoc.setGoodsImgs("http://oo8a9uu18.bkt.clouddn.com/20170414095840_440.jpeg,http://oo8a9uu18.bkt.clouddn.com/20170414095840_575.jpeg");
  18. GoodsModel goodsESDoc2 = new GoodsModel();
  19. goodsESDoc2.setId(2L);
  20. goodsESDoc2.setGoodsId(2L);
  21. goodsESDoc.setGoodsCode("2");
  22. goodsESDoc2.setGoodsName("百事可乐六联包");
  23. goodsESDoc2.setDescription("百事可乐六联包");
  24. goodsESDoc2.setPrice(21d);
  25. goodsESDoc2.setGoodsImgs("http://oo8a9uu18.bkt.clouddn.com/20170414095840_440.jpeg,http://oo8a9uu18.bkt.clouddn.com/20170414095840_575.jpeg");
  26. List<GoodsModel> goodsESDocs = Arrays.asList(goodsESDoc, goodsESDoc2);
  27. goodsESDocRepository.save(goodsESDocs);
  28. }
  29. @Test
  30. public void findOne() {
  31. GoodsModel goodsESDoc1 = goodsESDocRepository.findOne(1L);
  32. System.out.println(JSON.toJSONString(goodsESDoc1));
  33. }
  34. /**
  35. * 分词 分页查询
  36. */
  37. @Test
  38. public void testSelect3() {
  39. //组装查询
  40. Map<String, Object> filedContentMap = Maps.newHashMap();
  41. filedContentMap.put("goodsName", "可乐");
  42. String sortFields[] = {};
  43. //排序字段 默认综合排序
  44. sortFields = new String[]{"price"};
  45. String sort_type = "asc";
  46. BasePage<GoodsModel> page = new BasePage<>();
  47. page.setPageNo(1);
  48. page.setPageSize(10);
  49. String[] resultFields = {"id", "goodsCode", "goodsName", "goodsImgs", "price", "goodsId"};
  50. BasePage<GoodsModel> goodsESDocBasePage = goodsEsDocService.queryPage(filedContentMap, null, sortFields, sort_type, page, resultFields);
  51. List<GoodsModel> goodsESDocs = goodsESDocBasePage.getResults();
  52. JSONObject result = new JSONObject();
  53. result.put("datas", goodsESDocs);
  54. result.put("page_no", goodsESDocBasePage.getPageNo());
  55. result.put("page_size", goodsESDocBasePage.getPageSize());
  56. result.put("total_page", goodsESDocBasePage.getTotalPage());
  57. result.put("total_record", goodsESDocBasePage.getTotalRecord());
  58. System.out.println(JSON.toJSONString(result));
  59. }