Gallery
Search
Elasticsearch๋ ๋ํ ๋ด๋ถ์ ์ผ๋ก ์ ์์ ์ ์ด๋ฉฐ, ์ด๋ค ์๊ณ ๋ฆฌ์ฆ, ์๋ฃ๊ตฌ์กฐ ๋ฑ๋ฑ์ด๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ๊ฒ์ด ๋ณด์ฅ๋๋์ง์ ๋ํ ์ดํด๋ ์ถ๊ฐ ํ์
Elasticsearch๊ฐ ๋ด๋ถ์ ์ผ๋ก ์์ ์ ์ด๋ฉฐ ๋น ๋ฅธ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
1.
๋จผ์ , Elasticsearch๋ Apache Lucene์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก์ต๋๋ค. Lucene์ ๊ฒ์ ์์ง์ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํ
์คํธ ์ธ๋ฑ์ฑ๊ณผ ๊ฒ์์ ํนํ๋ผ ์์ต๋๋ค.
2.
Elasticsearch๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ ์ค ํ๋๋ ์ญ์์ธํ๋ผ๋ ๊ฐ๋
์
๋๋ค. ์ญ์์ธํ๋๋ ๋จ์ด๊ฐ ์ด๋ ๋ฌธ์์ ๋ํ๋๋์ง๋ฅผ ๊ธฐ๋กํด ๋์ด ๊ฒ์ ์๋๋ฅผ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
3.
Elasticsearch๋ ๋ถ์ฐ ์์คํ
์ผ๋ก ์ค๊ณ๋ผ ์์ด์ ์ฌ๋ฌ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ ์ ์ฅํ๊ณ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ฐ์ดํฐ ๊ฒ์ ๋ฐ ๋ถ์ ์์
์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
4.
Elasticsearch๋ ์ค์๊ฐ ๊ฒ์์ ์ง์ํ๊ณ ์์ด์ ๋ฐ์ดํฐ๊ฐ ์
๋ฐ์ดํธ๋๋๋ผ๋ ๊ฑฐ์ ์ค์๊ฐ์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋๊ท๋ชจ์ ๋ฐ์ดํฐ์
์์๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ๋ฐ ๊ธฐ์ฌํ๊ณ ์์ต๋๋ค.
์๋ผ์คํฑ ์์น์ ๊ฒ์์ด ๋น ๋ฅธ ์ด์ ?
[Spring][258] Elasticsearch์ Lucene ์ธ๋ฑ์ฑ
JPQL ์ฟผ๋ฆฌ๋ก ์ง์ ๊ฒ์ ๋ฐฉ์ ์ ํ๊ธฐ
@Repository
public interface ElasticBookSearchRepository extends ElasticsearchRepository<ElasticsearchBook, Long>, ElasticCustomBookSearchRepository {
// ์ด๊ฑด ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฐ์ฐ๋ถ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์
// ์ ์ด๊ถ์ด ๊ฐ๋ฐ์์ ์์
//List<ElasticsearchBook> findByBookNameContains(String keyword);
// Elasticsearch API์ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด์ ๋ณ๊ฒฝํด๋ณด๋ ๋ฐฉ๋ฒ
// ์ด๊ฑด ์ ์ด๊ถ์ด Spring Data Elasticsearch ์ ์์
// ์ฟผ๋ฆฌ๋ฅผ SPE๊ฐ ๋ถ์ํจ
//QueryStringQuery - ์๋ผ์คํฑ์์น ๋ด์ฅ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ
@Query("{\"query_string\": {\"query\": \"?0\"}}")
List<ElasticsearchBook> findByQueryStringQuery(String queryString, Pageable pageable);
//์กฐ๊ฑด๊ฒ์(bool)
//@Query("{\"bool\": {\"must\": {\"query_string\": {\"query\": \"?0\"}}}}")
//List<ElasticsearchBook> findByQueryStringQuery(String queryString, Pageable pageable);
/*
must: [ํ๋] AND [์ปฌ๋ผ] = [์กฐ๊ฑด]
must_not: [ํ๋] AND [์ปฌ๋ผ] != [์กฐ๊ฑด]
should: [ํ๋] OR [์ปฌ๋ผ] = [์กฐ๊ฑด]
filter: [ํ๋] [์ปฌ๋ผ] IN ( [์กฐ๊ฑด] )
*/
}
์๋ ์ฟผ๋ฆฌ๋ฅผ @Query ์ด๋
ธํ
์ด์
์ ํตํด์ ์์ฑํ์ฌ ๊ฒ์์ ๋ฐฉ์์ ๋ณ๊ฒฝ ํ ์ ์๋ค. ๊ธฐ์กด ์ง์ ๋ด๋ถ ๋ก์ง์ ๊ตฌ์ฑํ๋ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ, ๋ง์น JPQL์ ์ฌ์ฉํ๋๊ฒ ์ฒ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑ ํ ์ ์๋ค. ๊ทธ๋ผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฟผ๋ฆฌ๋ฌธ์ด ์ปดํ์ผ ๋จ๊ณ์์ ๊ฒ์ฌ๋์ง ์๋ ๋จ์ ์ด ์์ ๊ฒ์ผ๋ก ๋ณด์ฌ์ง๋ค.
QueryDSL๋ก ๊ตฌํํด๋ณด๊ธฐ
build.gradle ์์กด์ฑ ์ถ๊ฐ
dependencies {
implementation 'com.querydsl:querydsl-apt:4.x.x'
implementation 'com.querydsl:querydsl-elasticsearch:4.x.x'
}
QueryDSL ํ๋ฌ๊ทธ์ธ ๋ฐ ํ์คํฌ ์ค์
plugins {
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
querydsl {
jpa = false
querydslSourcesDir = 'src/main/generated'
}
sourceSets {
main {
java {
srcDir 'src/main/generated'
}
}
}
configurations {
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
[Spring][258] Elasticsearch APIs
EC2 Kibana์ ์ธ๋ถ ์ ์ ํ๊ฒฝ ์ค์
Kibana๋ Elasticsearch์ ๋ฐ์ดํฐ๋ฅผ ๊ด์ ํ๊ณ ๊ฐ์ข
๋ถ์๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๊ฐํ๋ฅผ ๋ด๋นํ๋ HTML + Javascript ์์ง์ด๋ผ ๋ณผ ์ ์์ต๋๋ค.
ํ์ง๋ง EC2์์ ๊ตฌ์ถํ ๊ฒฝ์ฐ ํด๋น ์๋น์ค์ ์ ์ํ๊ธฐ ์ํด์๋ ์ธ๋ถ ์ฌ์ฉ์ ๋๋ ๊ด๋ฆฌ์๊ฐ EC2์๋ฒ์ 5601ํฌํธ์ ์ ๊ทผ ํ ์ ์์ด์ผ ํ๋๋ฐ ๋๋ถ๋ถ์ DB๋ ๊ธฐ๋ณธ์ ์ผ๋ก Localhost๋ฅผ ํตํ ์ ๊ทผ๋ง์ ํ์ฉํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ธ๋ถ ์ ์์ ๋ํ ์ปค๋ฅ์
์ ์ด์ด์ฃผ์ด์ผ ํฉ๋๋ค.
Kibana์ ์ค์ ํ์ผ์ EC2์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๋ก์ ์์นํฉ๋๋ค. vi์๋ํฐ๋ฅผ ํตํด CLIํ๊ฒฝ์์ ํ์ผ์ ์์ ํฉ๋๋ค.
sudo vi /etc/kibana/kibana.yml
server.host ๋ถ๋ถ์ด ๊ธฐ๋ณธ์ ์ผ๋ก localhost๋ก ๋์ด์์ผ๋ฉฐ, ์ด๊ฒ ์กฐ์ฐจ ์ฃผ์์ฒ๋ฆฌ๋์ด default๊ฐ localhost์์ ์๋ ค์ฃผ๊ณ ์์ต๋๋ค. ํด๋น ๋ถ๋ถ์ ์ธ๋ถ ์ ๊ทผ์ ํ์ฉ ํ ์ ์๋๋ก 0.0.0.0์ ์
๋ ฅํด์ค๋๋ค.
Kibana์ ๊ธฐ๋ณธ ํฌํธ๋ 5601ํฌํธ์
๋๋ค.
server.host: "0.0.0.0"
[Spring][258] AWS EC2 Elastic Stack์ Kibana ์ธ๋ถ ์ ์ ํ๊ฒฝ ์ค์

[Spring][258] AWS EC2 Elasticsearch ์ธ๋ถ ์ ์ ํ๊ฒฝ ์ค์

[Spring][258] AWS EC2์ ๊ตฌํ๋ Elasticsearch ์ ๋ด ์ธ๋ถ(RDS) MySQL ๋ฐ์ดํฐ ์ ๋ฌ ํ
์คํธ ๋ฐ EC2 ์ค์ผ์ผ์

[Spring][258] AWS EC2 ubuntu ํ๊ฒฝ์ Elasticsearch ๊ตฌ์ถ
MySQL DB์ ๋ฐ์ดํฐ์ Elasticsearch ๋ฐ์ดํฐ๋ ๋๊ธฐํ๋ก ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํ๋ค.
๊ธฐ์กด MVP ๊ธฐ๋ฅ์ผ๋ก ๋์์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ถ๋ถ๋ค์ด ์์ต๋๋ค. ํนํ Elasticsearch์ ์ฐ๊ฒฐ๋ ๋์ ๋ชฉ๋ก์์ ์ฌ์ฉ์๋ ๋์ ๋์ถ, ๋์ ๋์ถ ์์ฝ์ ์งํ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ๋์ ๋์ถ์ ์งํํ๋ฉด ๋์์ ๋์ถ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ ์ ์๋ Status ์ปฌ๋ผ์ POSSIBLE์์ IMPOSSIBLE๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. ํด๋น ๊ธฐ๋ฅ์ HTML์ Ajax HTTP ์์ฒญ์ ํตํด MySQL DB์ ์๋ ๋์ book_id์ ๋์์ ์ํ๋ฅผ ์ฆ์ ๋ณ๊ฒฝํ์ง๋ง, Elasticsearch๋ MySQL์ DB๋ฅผ Logstash๋ก ๊ฐ์ ธ์์ ์ธ๋ฑ์ฑํ๊ธฐ ๋๋ฌธ์ ์ด ๊ณผ์ ์์ ์๋ก ๋ชฉ๋ก์ ๋ถ๋ฌ์์ผ ํ ํ์์ฑ์ด ์์ต๋๋ค.
Logstash์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ถ์ ์ค์ ํ์์ฑ
๊ธฐ์กด Logstash๋ฅผ ํตํด MySQL์ DB๋ฅผ ์ ๋ฌํ์ฌ ์์ธํ๋ ๋ถ๋ถ์
๋๋ค. 709๋ง๊ฐ์ ๋์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ฝ์ด์ค๋ ๊ณผ์ ์์ JVM์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ํ์์ด ๋ฐ์ํ์ฌ 200๋ง๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ณ Elasticsearch๋ก ์ ๋ฌํ๋๋ก ๊ตฌ์ฑ๋์ด์์ต๋๋ค.
# sample.conf
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://localhost:3306/team258"
jdbc_user => "inyongkim"
jdbc_password => "1234"
jdbc_driver_library => "/Users/inyongkim/.gradle/caches/modules-2/files-2.1/mysql/mysql-connector-java/8.0.25/f8b9123acd13058c941aff25f308c9ed8000bb73/mysql-connector-java-8.0.25.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_paging_enabled => true
jdbc_page_size => 2000000 # ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ธ์.
statement => "SELECT * FROM book"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "book"
document_id => "%{book_id}"
}
}
ํ์ง๋ง ์ด ๋ถ๋ถ์์ ์ค์ ์ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
[Spring][258] MySQLโLogstashโElasticsearch ์ ๋๊ธฐํ ์ฒ๋ฆฌ์์ ๋ฐ์ํ๋ ๋ฌธ์

[Spring][258] ์๋ฒ ์ค์ผ์ผ ์
: AWS EC2 ์ธ์คํด์ค ์
๊ทธ๋ ์ด๋ ๋ฐ ์ฑ๋ฅ ํฅ์


