Skip to content

Commit badb5b4

Browse files
committed
Add fuzzy search using ElasticsearchTemplate
1 parent b0b9c9f commit badb5b4

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

src/main/java/com/madadipouya/elasticsearch/springdata/example/controller/BookController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ public Book getBookByIsbn(@PathVariable String isbn) throws BookNotFoundExceptio
4141
return bookService.getByIsbn(isbn).orElseThrow(() -> new BookNotFoundException("The given isbn is invalid"));
4242
}
4343

44+
@ResponseStatus(HttpStatus.OK)
45+
@GetMapping(value = "/query")
46+
public List<Book> getBooksByAuthorAndTitle(@RequestParam(value = "title") String title, @RequestParam(value = "author") String author) {
47+
return bookService.findByTitleAndAuthor(title, author);
48+
}
49+
4450
@ResponseStatus(HttpStatus.OK)
4551
@PutMapping(value = "/{id}")
4652
public Book updateBook(@PathVariable String id, @RequestBody BookDto book) throws BookNotFoundException {

src/main/java/com/madadipouya/elasticsearch/springdata/example/service/BookService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public interface BookService {
1515

1616
List<Book> findByAuthor(String authorName);
1717

18+
List<Book> findByTitleAndAuthor(String title, String author);
19+
1820
Book create(Book book) throws DuplicateIsbnException;
1921

2022
void deleteById(String id);

src/main/java/com/madadipouya/elasticsearch/springdata/example/service/impl/DefaultBookService.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.madadipouya.elasticsearch.springdata.example.service.impl;
22

3-
import com.madadipouya.elasticsearch.springdata.example.service.exception.BookNotFoundException;
43
import com.madadipouya.elasticsearch.springdata.example.model.Book;
54
import com.madadipouya.elasticsearch.springdata.example.repository.BookRepository;
65
import com.madadipouya.elasticsearch.springdata.example.service.BookService;
6+
import com.madadipouya.elasticsearch.springdata.example.service.exception.BookNotFoundException;
77
import com.madadipouya.elasticsearch.springdata.example.service.exception.DuplicateIsbnException;
8+
import org.elasticsearch.index.query.BoolQueryBuilder;
9+
import org.elasticsearch.index.query.QueryBuilders;
10+
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
11+
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
812
import org.springframework.stereotype.Service;
913

1014
import java.util.ArrayList;
@@ -16,8 +20,11 @@ public class DefaultBookService implements BookService {
1620

1721
private final BookRepository bookRepository;
1822

19-
public DefaultBookService(BookRepository bookRepository) {
23+
private final ElasticsearchTemplate elasticsearchTemplate;
24+
25+
public DefaultBookService(BookRepository bookRepository, ElasticsearchTemplate elasticsearchTemplate) {
2026
this.bookRepository = bookRepository;
27+
this.elasticsearchTemplate = elasticsearchTemplate;
2128
}
2229

2330
@Override
@@ -37,6 +44,13 @@ public List<Book> findByAuthor(String authorName) {
3744
return bookRepository.findByAuthorName(authorName);
3845
}
3946

47+
@Override
48+
public List<Book> findByTitleAndAuthor(String title, String author) {
49+
BoolQueryBuilder criteria = QueryBuilders.boolQuery();
50+
criteria.must().addAll(List.of(QueryBuilders.matchQuery("authorName", author), QueryBuilders.matchQuery("title", title)));
51+
return elasticsearchTemplate.queryForList(new NativeSearchQueryBuilder().withQuery(criteria).build(), Book.class);
52+
}
53+
4054
@Override
4155
public Book create(Book book) throws DuplicateIsbnException {
4256
if (getByIsbn(book.getIsbn()).isEmpty()) {

0 commit comments

Comments
 (0)