Advertisement
Aleksandr37rus

Untitled

Dec 19th, 2022
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.13 KB | None | 0 0
  1. @Service
  2. public class SearchProductsMapper {
  3.  
  4.     private static final String REGEX = "(\\[|\\])";
  5.    
  6.     @Autowired
  7.     private ElasticsearchClient esClient;
  8.  
  9.     @SneakyThrows
  10.     public List<Product> search(SearchProductsDto searchProductsDto) {
  11.         final SearchResponse<Product> response;
  12.         if (searchProductsDto.isRelevance()) {
  13.             if (!ObjectUtils.isEmpty(searchProductsDto.getPriceAsc()) && searchProductsDto.getPriceAsc().equals("price_asc")) {
  14.                 response = esClient.search(s -> getBuilder(searchProductsDto, s)
  15.                                 .sort(sort -> getSortObjects(sort, SortOrder.Asc, "price.p1"))
  16.                                 .highlight(SearchProductsMapper::getFields),
  17.                         Product.class);
  18.                 return getProducts(response);
  19.             }
  20.             else if (!ObjectUtils.isEmpty(searchProductsDto.getPriceDesc()) && searchProductsDto.getPriceDesc().equals("price_desc")) {
  21.                 response = esClient.search(s -> getBuilder(searchProductsDto, s)
  22.                                 .sort(sort -> getSortObjects(sort, SortOrder.Desc, "price.p1"))
  23.                                 .highlight(SearchProductsMapper::getFields),
  24.                         Product.class);
  25.                 return getProducts(response);
  26.             }
  27.             else if (!ObjectUtils.isEmpty(searchProductsDto.getQuantityAsc()) && searchProductsDto.getQuantityAsc().equals("quantity_asc")) {
  28.                 response = esClient.search(s -> getBuilder(searchProductsDto, s)
  29.                                 .sort(sort -> getSortObjects(sort, SortOrder.Asc, "quantity.tv"))
  30.                                 .highlight(SearchProductsMapper::getFields),
  31.                         Product.class);
  32.                 return getProducts(response);
  33.             }
  34.             else if (!ObjectUtils.isEmpty(searchProductsDto.getQuantityDesc()) && searchProductsDto.getQuantityDesc().equals("quantity_desc")) {
  35.                 response = esClient.search(s -> getBuilder(searchProductsDto, s)
  36.                                 .sort(sort -> getSortObjects(sort, SortOrder.Desc, "quantity.tv"))
  37.                                 .highlight(SearchProductsMapper::getFields),
  38.                         Product.class);
  39.                 return getProducts(response);
  40.             }
  41.         }
  42.         response = esClient.search(s -> getBuilder(searchProductsDto, s)
  43.                         .highlight(SearchProductsMapper::getFields),
  44.                 Product.class);
  45.         return getProducts(response);
  46.     }
  47.  
  48.     private static ObjectBuilder<SortOptions> getSortObjects(SortOptions.Builder sort, SortOrder desc, String value) {
  49.         return sort
  50.                 .field(f -> f
  51.                         .order(desc)
  52.                         .field(value)
  53.                 );
  54.     }
  55.  
  56.     private static Highlight.Builder getFields(Highlight.Builder h) {
  57.         return h
  58.                 .preTags("[<em><b>]")
  59.                 .postTags("[</b></em> ]")
  60.                 .fields("productDescription", f -> f.withJson(new StringReader("{}")))
  61.                 .fields("vendorArticle", f -> f.withJson(new StringReader("{}")))
  62.                 .fields("itemCode", f -> f.withJson(new StringReader("{}")));
  63.     }
  64.  
  65.     private static SearchRequest.Builder getBuilder(SearchProductsDto searchProductsDto, SearchRequest.Builder s) {
  66.         return s
  67.                 .index("product")
  68.                 .from(searchProductsDto.getFrom())
  69.                 .size(searchProductsDto.getPageSize())
  70.                 .query(q -> q
  71.                         .bool(bool -> bool
  72.                                 .must(must -> must
  73.                                         .multiMatch(t -> t
  74.                                                 .fields("productDescription", "vendorArticle", "itemCode")
  75.                                                 .query(searchProductsDto.getQuery())
  76.                                         )
  77.                                 )
  78.                                 .should(should -> should
  79.                                         .match(match -> match
  80.                                                 .field("vendorArticle")
  81.                                                 .query(searchProductsDto.getQuery())
  82.                                                 .boost(1.0F)
  83.                                         )
  84.                                 )
  85.                                 .should(should -> should
  86.                                         .match(match -> match
  87.                                                 .field("itemCode")
  88.                                                 .query(searchProductsDto.getQuery())
  89.                                                 .boost(0.7F)
  90.                                         )
  91.                                 )
  92.                                 .should(should -> should
  93.                                         .match(match -> match
  94.                                                 .field("inStock")
  95.                                                 .query(true)
  96.                                                 .boost(1.0F)
  97.                                         )
  98.                                 )
  99.                         )
  100.                 );
  101.     }
  102.  
  103.     private List<Product> getProducts(SearchResponse<Product> response) {
  104.         return response.hits().hits().stream().map(hit -> {
  105.             Product product = hit.source();
  106.             assert product != null;
  107.             if (hit.highlight().get("productDescription") != null) {
  108.                 product.setProductDescription(hit.highlight().get("productDescription").toString()
  109.                         .replace(REGEX, EMPTY));
  110.             }
  111.             if (hit.highlight().get("vendorArticle") != null) {
  112.                 product.setVendorArticle(hit.highlight().get("vendorArticle").toString()
  113.                         .replace(REGEX, EMPTY));
  114.             }
  115.             if (hit.highlight().get("itemCode") != null) {
  116.                 product.setItemCode(hit.highlight().get("itemCode").toString()
  117.                         .replace(REGEX, EMPTY));
  118.             }
  119.             return product;
  120.         }).collect(Collectors.toList());
  121.     }
  122.  
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement