SpringBoot 는 Elasticsearch 를 통합 하여 CRUD 작업 을 실현 합 니 다.
build.gradle 파일 에 다음 의존 도 를 추가 합 니 다:
compile "org.elasticsearch.client:transport:5.5.2"
compile "org.elasticsearch:elasticsearch:5.5.2"
//es 5.x apache log4
compile "org.apache.logging.log4j:log4j-core:2.7"
compile "org.apache.logging.log4j:log4j-api:2.7"
여기 서 spring boot 는 1.5.4 버 전 을 사 용 했 습 니 다.며칠 전에 spring boot 2 정식 버 전이 발표 되 었 습 니 다.spring boot 2 의 새로운 기능 중 하 나 는 kotlin 을 지원 하 는 것 입 니 다.spring boot 2 는 spring 5 를 기반 으로 하고 spring 5 도 koltin 을 지원 하기 때문에 spring 도 함수 식 프로 그래 밍 을 지원 하기 시 작 했 습 니 다.에 대하 여버 전 호 환
Elasticsearch 에 접근 할 클 라 이언 트 를 설정 합 니 다.원본 es 자바 API 를 사용 합 니 다.
@Configuration
public class ElasticSearchConfig {
@Bean(name = "client")
public TransportClient getClient() {
InetSocketTransportAddress node = null;
try {
node = new InetSocketTransportAddress(InetAddress.getByName("192.168.124.128"), 9300);
} catch (UnknownHostException e) {
e.printStackTrace();
}
Settings settings = Settings.builder().put("cluster.name", "my-es").build();
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(node);
return client;
}
}
Socket Transport 포트 는http://ip:9200/_nodes방식 으로 볼 수 있 습 니 다.여 기 는 기본적으로 9300 포트 를 사용 합 니 다.CRUD 조작
원본 es 자바 API 를 사용 하 는 컨트롤 러 ElasticSearchController 를 새로 만 듭 니 다.
@RestController
public class ElasticSearchController {
@Autowired
TransportClient client;
}
컨트롤 러 에 삭제 및 수정 방법 을 추가 합 니 다.추가 작업
@PostMapping("add/book/novel")
public ResponseEntity add(
@RequestParam(name = "title") String title, @RequestParam(name = "authro") String author,
@RequestParam(name = "word_count") int wordCount,
@RequestParam(name = "publish_date") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date publishDate
)
{
try {
XContentBuilder content = XContentFactory.jsonBuilder().startObject()
.field("title", title)
.field("author", author)
.field("word_count", wordCount)
.field("publish_date", publishDate.getTime())
.endObject();
IndexResponse result = this.client.prepareIndex("book", "novel").setSource(content).get();
return new ResponseEntity(result.getId(), HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
삭제 작업
@DeleteMapping("/delete/book/novel")
public ResponseEntity delete(@RequestParam(name = "id") String id)
{
DeleteResponse result = client.prepareDelete("book", "novel", id).get();
return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
}
찾기 동작
@GetMapping("/get/book/novel")
public ResponseEntity get(@RequestParam(name = "id", defaultValue="") String id)
{
if (id.isEmpty())
{
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
GetResponse result = this.client.prepareGet("book", "novel", id).get();
if (!result.isExists())
{
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
return new ResponseEntity(result.getSource(), HttpStatus.OK);
}
업데이트 작업
@PutMapping("/put/book/novel")
public ResponseEntity update(@RequestParam(name = "id") String id, @RequestParam(name = "title", required = false) String title,
@RequestParam(name = "author", required = false) String author
)
{
try {
XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
if (title!= null)
{
builder.field("title", title);
}
if (author != null)
{
builder.field("author", author);
}
builder.endObject();
UpdateRequest updateRequest = new UpdateRequest("book", "novel", id);
updateRequest.doc(builder);
UpdateResponse result = client.update(updateRequest).get();
return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
복합 검색
@GetMapping("/query/book/novel")
public ResponseEntity query(@RequestParam(name = "author", required = false) String author,
@RequestParam(name = "title", required = false) String title,
@RequestParam(name = "gt_word_count", defaultValue = "0") int gtWordCount,
@RequestParam(name = "lt_word_count", required = false) Integer ltWordCount)
{
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (author != null)
{
boolQueryBuilder.must(QueryBuilders.matchQuery("author",author));
}
if (title != null)
{
boolQueryBuilder.must(QueryBuilders.matchQuery("title", title));
}
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("word_count").from(gtWordCount);
if (ltWordCount != null && ltWordCount > 0)
{
rangeQueryBuilder.to(ltWordCount);
}
boolQueryBuilder.filter(rangeQueryBuilder);
SearchRequestBuilder searchRequestBuilder = this.client.prepareSearch("book")
.setTypes("novel")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(boolQueryBuilder)
.setFrom(0)
.setSize(10);
System.out.println(searchRequestBuilder); //
SearchResponse response = searchRequestBuilder.get();
List<Map<String, Object>> result = new ArrayList<>();
for (SearchHit hit : response.getHits())
{
result.add(hit.getSource());
}
return new ResponseEntity(result, HttpStatus.OK);
}
위의 코드 조직의 복합 조 회 는 아래 의 Query DSL 과 유사 합 니 다.
{
"query":{
"bool":{
"must":[
{"match":{"author":" "}},
{"match":{"title":"Elasticsearch"}}
],
"filter":[
{"range":
{"word_count":{
"gt":"0",
"lt":"3000"
}
}
}
]
}
}
}
총결산위 에서 말 한 것 은 편집장 이 소개 한 SpringBoot 가 Elasticsearch 를 통합 하여 CRUD 작업 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.