5. Webflux Java 코드 예제
Elassandr공홈의 예제를 보고 해봤다.
docs라는 테이블 안의 username이라는 UDT의 필드를 검색하는데 완전일치 일 경우이다.
리액티브용 인터페이스를 사용해서도 이런식으로 되는지 조금더 조사를 해봐야겠다.
일단은 이런식으로 사용가능하다는 것을 확인했으니. 한숨 놨다...
public Mono<List<Docs>> esFromDocs(String keyword) {
String query = "SELECT uid, login, username " +
"FROM test.docs " +
"WHERE es_query = '{ \"query\":{\"nested\":{\"path\":\"username\",\"query\":{\"term\":{\"username.first\":" +
"\"" +
keyword +
"\"" +
"}}}}}' " +
" AND es_options = 'indices=test' ALLOW FILTERING;";
return Mono.just(cassandraOperations.select(query, Docs.class));
}
docs라는 테이블 안의 username이라는 UDT의 필드를 검색하는데 like 일 경우이다. term이 아닌 wildcard라는 키워드로 검색이 가능하다.
public Mono<List<Docs>> esFromDocs(String keyword) {
String query = "SELECT uid, login, username " +
"FROM test.docs " +
"WHERE es_query = '{ \"query\":{\"nested\":{\"path\":\"username\",\"query\":{\"wildcard\":{\"username.first\":" +
"\"" +
"*" +
keyword +
"*" +
"\"" +
"}}}}}' " +
" AND es_options = 'indices=test' ALLOW FILTERING;";
return Mono.just(cassandraOperations.select(query, Docs.class));
}
- WHERE es_query 이후의 내용은 Json편집기 + Elasticsearch검색방법 을 통해서 예쁘게 작성.
- Json의 내용을 자바에 쌩 String코드로 박아야 하니 한줄로 편집
- 검색 문자열을 잘 Binding하도록 문자열을 예쁘게 수정
- indices(색인)는 검색할 키스페이스 설정
- ALLOW FILTERING이 필요한 경우에는 지정. 아마 대부분 지정해야 할 듯.(Partision Key / Clustering Key검색이 아니므로)
공홈 코드를 기준으로
public Mono<List<Docs>> esFromDocs(String keyword) {
String esQuery = new SearchSourceBuilder().query(QueryBuilders.termQuery("user", "vince")).toString(ToXContent.EMPTY_PARAMS);
ResultSet results = session.execute("SELECT * FROM users WHERE es_query = ? ALLOW FILTERING", esQuery);
List<Docs> docs = new ArrayList<>();
results.forEach(row -> {
docs.add(Docs.builder()
.uid(row.getInt("uid"))
.login(row.getString("login"))
.username(Username.builder()
.first(row.getString("username.first"))
.last(row.getString("username.last"))
.build())
.build());
});
return Mono.just(docs);
}