preface

Spring Data Elasticsearch Spring Data Elasticsearch Mainly use the ElasticsearchRestTemplate, ElasticsearchRepository class to implement Java Api Index, DocumentCRUD operation.

Before starting, we first need to select the JAR package of the Es version. The Es version used in this article is 7.9.3, and the corresponding SpringBoot version is 2.4.x according to the official website of Spring.

integration

Create a Maven project and you’re ready to go.

configuration

pom.xml

Import the following JAR packages:

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.0</version> <relativePath/> </parent> <dependencies> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> The < artifactId > fastjson < / artifactId > < version > 1.2.71 < / version > < / dependency > < / dependencies >Copy the code

application.properties

spring.data.elasticsearch.repositories.enabled = true
spring.elasticsearch.rest.uris=localhost:9200
Copy the code

ElasticsearchRestTemplate configuration

@Configuration public class ElasticsearchRestTemplateConfig extends AbstractElasticsearchConfiguration { @Value("${spring.elasticsearch.rest.uris}") private String uris; @Override public RestHighLevelClient elasticsearchClient() { ClientConfiguration configuration = ClientConfiguration.builder() .connectedTo(uris) .build(); return RestClients.create(configuration).rest(); }}Copy the code

code

Model

A Model is similar to a database entity, except that it maps the fields of Index and Document. You can check the Spring official website.

@Data
@Document(indexName = "order", shards = 1, replicas = 1)
public class Order implements Serializable {
    @Id
    private Integer id;

    @Field(type = FieldType.Keyword)
    private Long orderNo;

    @Field(type = FieldType.Integer)
    private Integer orderType;

    @Field(type = FieldType.Long)
    private Long orderAmount;

    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
    private String orderDesc;

    @Field(type = FieldType.Keyword, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
    private String username;

    @Field(type = FieldType.Keyword, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
    private String userPhone;

    private Map<String, List<String>> highlights;
}
Copy the code

Repository

The ElasticsearchRepository interface encapsulates the Document CRUD operation.

public interface OrderRepository extends ElasticsearchRepository<Order, Integer> {
}
Copy the code

Service

public interface OrderService {
    void saveAll(List<Order> orders);

    Order findById(Integer id);

    void deleteById(Integer id);

    void updateById(Order order);

    PageResponse<Order> findList(Order order, Integer pageIndex, Integer pageSize);

    PageResponse<Order> findAll(Integer pageIndex, Integer pageSize);

    PageResponse<Order> findHighlight(Order order, Integer pageIndex, Integer pageSize);
}
Copy the code
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
    @Autowired
    OrderRepository orderRepository;

    @Autowired
    ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Override
    public void saveAll(List<Order> orders) {
        orderRepository.saveAll(orders);
    }

    @Override
    public void deleteById(Integer id) {
        orderRepository.deleteById(id);
    }

    @Override
    public void updateById(Order order) {
        orderRepository.save(order);
    }

    @Override
    public PageResponse<Order> findList(Order order, Integer pageIndex, Integer pageSize) {
        CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and(new Criteria("orderDesc").contains(order.getOrderDesc()))
                .and(new Criteria("orderNo").is(order.getOrderNo())))
                .setPageable(PageRequest.of(pageIndex, pageSize));

        SearchHits<Order> searchHits = elasticsearchRestTemplate.search(criteriaQuery, Order.class);
        List<Order> result = searchHits.get().map(SearchHit::getContent).collect(Collectors.toList());
        PageResponse<Order> pageResponse = new PageResponse<Order>();
        pageResponse.setTotal(searchHits.getTotalHits());
        pageResponse.setResult(result);
        return pageResponse;
    }

    @Override
    public PageResponse<Order> findAll(Integer pageIndex, Integer pageSize) {
        Page<Order> page = orderRepository.findAll(PageRequest.of(pageIndex, pageSize));

        PageResponse<Order> pageResponse = new PageResponse<Order>();
        pageResponse.setTotal(page.getTotalElements());
        pageResponse.setResult(page.getContent());
        return pageResponse;
    }

    @Override
    public PageResponse<Order> findHighlight(Order order, Integer pageIndex, Integer pageSize) {
        if (order == null) {
            PageResponse<Order> pageResponse = new PageResponse<Order>();
            pageResponse.setTotal(0L);
            pageResponse.setResult(new ArrayList<>());
            return pageResponse;
        }

        CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and(new Criteria("orderNo").is(order.getOrderNo()))
                .and(new Criteria("orderDesc").contains(order.getOrderDesc())))
                .setPageable(PageRequest.of(pageIndex, pageSize));

        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("orderNo").field("orderDesc");
        highlightBuilder.requireFieldMatch(false);
        highlightBuilder.preTags("<h3 style="color:blue">");
        highlightBuilder.postTags("</h3>");

        HighlightQuery highlightQuery = new HighlightQuery(highlightBuilder);
        criteriaQuery.setHighlightQuery(highlightQuery);

        SearchHits<Order> searchHits = elasticsearchRestTemplate.search(criteriaQuery, Order.class);

        List<Order> result = searchHits.get().map(e -> {
            Order element = e.getContent();
            element.setHighlights(e.getHighlightFields());
            return element;
        }).collect(Collectors.toList());

        PageResponse<Order> pageResponse = new PageResponse<Order>();
        pageResponse.setTotal(searchHits.getTotalHits());
        pageResponse.setResult(result);
        return pageResponse;
    }

    @Override
    public Order findById(Integer id) {
        return orderRepository.findById(id).orElse(null);
    }
Copy the code

Controller

  • The Index operation

Using ElasticsearchRestTemplate directly can create and delete index.

@RequestMapping("/index/") @RestController public class IndexController { @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; @getMapping ("create") public String Create (@requestParam String indexName) {IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(IndexCoordinates.of(indexName)); If (indexOperations.exists()) {return "Index exists "; } indexOperations.create(); Return "index created successfully "; } /** * delete index */ @getMapping ("delete") public String delete(@requestParam String indexName) {IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(IndexCoordinates.of(indexName)); indexOperations.delete(); Return "index deleted successfully "; }}Copy the code
  • The Document operation

It mainly includes simple query, add, delete and change, paging query and highlight search.

@RequestMapping("/doc/") @RestController public class DocController { @Autowired OrderService orderService; @postMapping ("saveBatch") public String saveBatch(@requestBody List<Order> Orders) {if (collectionutils.isEmpty (Orders)) {return "Document cannot be empty "; } orderService.saveAll(orders); Return "Save successfully "; } @getMapping ("deleteById") public String deleteById(@requestParam Integer ID) { orderService.deleteById(id); Return "Delete succeeded "; } @postmapping ("updateById") public String updateById(@requestBody Order Order) { orderService.updateById(order); Return "Update succeeded "; } /** * search by ID */ @getMapping ("findById") public String findById(@requestParam Integer ID) {return JSON.toJSONString(orderService.findById(id)); } @getMapping ("findAll") public String findAll(@requestParam Integer pageIndex, @RequestParam Integer pageSize) { return JSON.toJSONString(orderService.findAll(pageIndex, pageSize)); } @getMapping ("findList") public String findList(@requestBody Order Order, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) { return JSON.toJSONString(orderService.findList(order, pageIndex, pageSize)); } @getMapping ("findHighlight") public String findHighlight(@requestBody (required = false) Order Order  @RequestParam Integer pageIndex, @RequestParam Integer pageSize) { return JSON.toJSONString(orderService.findHighlight(order, pageIndex, pageSize)); }}Copy the code

test

Postman access controller directly to test. Example: