Advertisement
Aleksandr37rus

Untitled

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