SlideShare a Scribd company logo
1 of 40
Solr 활용 입문
제 2회 루씬한글분석기 기술세미나
1 다운로드
2 설치 및 실행
3 필드 구성
4 색인하기
5 검색하기
6 확장
7 커스트 마이징
3
Chapter 1
다운로드
4
01
http://lucene.apache.org/solr/
다운로드
5
01
Solr 의 버전 변화
다운로드
1.4.1 3.0
4.0
alpha
4.4
3.6
6
01 다운로드
7
01
war 풀고 묶기
다운로드
1) Jdbc Connector jar
- Oracle
http://www.oracle.com/technetwork/database/features/
jdbc/index-091264.html
- Mysql
http://cdn.mysql.com/Downloads/Connector-J/mysql-co
nnector-java-5.1.26.tar.gz
- MSSQL
http://msdn.microsoft.com/en-us/sqlserver/aa937724.a
spx
2) 한글 형태소 분석기 jar
3) 기타 추가 lib
다시 묶기
jar cvf ../solr4.4.0.war *
8
Chapter 2
설치 및 실행
9
02
Jetty 실행
java -Djetty.port=8080 –jar start.jar
설치 및 실행
Tomcat 실행
1) $TOMCAT_HOME/conf/Catalina/localhost/ 폴더에
solr44.xml 생성
<Context docBase="C:SOLR_HOMEsolr-4.4.0.war" debug="0"
crossContext="true" >
<Environment name="solr/home" type="java.lang.String"
value="C:SOLR_HOMEsolr44" override="true" />
</Context>
2) bin/startup.sh
Heap 메모리 늘리기
1) $TOMCAT_HOME/bin/catalina.sh 에 추가
JAVA_OPTS="-server -Xms1500m -Xmx1500m -
XX:MaxPermSize=256m"
10
02
실행 후 SOLR GUI
설치 및 실행
11
Chapter 3
필드 구성
12
03
기본 데이터 (우아한 형제들 제공 상점 정보)
1000건)
필드 구성
새로운 코어 생성
SOLR_HOME/solr.xml 수정
<cores adminPath="/admin/cores" host="${host:}"
hostPort="${jetty.port:8983}" hostContext="${hostContext:solr}">
<core name="core0" instanceDir="core0" />
<core name="core1" instanceDir="core1" />
<core name="shop" instanceDir="shop" /> <!– 추가 
</cores>
13
03
RDBMS vs 검색엔진
필드 구성
데이터베이스
행(Row)
테이블(Table)
컬럼(Column)
스키마
검색엔진
문서(Document)
인덱스(Core)
필드(Field)
스키마(Schema)
14
03
schema.xml 파일 수정
필드 구성
1) 사용할 필드 타입 정의
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
2)사용할 필드 정의
<fields>
<field name="Shop_No" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
<field name="Shop_Nm" type="string" indexed="true" stored="true" multiValued="false" />
<field name="Menu_Type" type="string" indexed="true" stored="true" multiValued="true" />
<field name="Rgn1" type="string" indexed="true" stored="true" multiValued="false" />
<field name="Rgn2" type="string" indexed="true" stored="true" multiValued="false" />
<field name="Rgn3" type="string" indexed="true" stored="true" multiValued="false" />
<field name="LatLng" type="location_rpt" indexed="true" stored="true" multiValued="false" />
<field name="_version_" type="long" indexed="true" stored="true"/>
</fields>
15
03
schema.xml 파일 수정
필드 구성
3) 유니크 키를 정의
<uniqueKey>Shop_No</uniqueKey>
4)기본 검색 필드 정의
<defaultSearchField>Shop_Nm</defaultSearchField>
5)기본 연산자 정의
<solrQueryParser defaultOperator="AND"/>
16
03
Analyzer 를 정의
필드 구성
<fieldType name="text_general" class="solr.TextField"
positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true"
words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt"
ignoreCase="true" expand="false"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true"
words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"
ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
17
03
Analyzer 란?
필드 구성
Lucene에서의 형태소 분석기란?
Tokenizer + Filter = Analyzer
Tokenizer는 무조건 1개맊 결합 할 수 있다.
Filter는 여러 개를 결합 가능하다.
Filter는 순서가 중요하다.
Tokenizer로 나누어진 것을 Token이라 하고
Filter를 거쳐서 최종적으로 색인시에 사용하는 것을 Term이라 한다.
18
Chapter 4
색인
19
04
REST API 방식
/update 핸들러에 REST 전송
<doc>
<field name="Shop_No">1</field>
<field name="Shop_Nm">쿼리젯</field>
<field name="Rgn1">서울특별시</field>
<field name="Rgn2">영등포구</field>
<field name="Rgn3">영등포동</field>
<field name="LatLng">35.8754666,128.5591111</field>
</doc>
<delete><id>05991</id></delete>
<Commit/>
<Optimize/>
색인
20
04
DIH 방식 (Data Import Handler)
1) solrconfig.xml 에 핸들러 정의
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.
DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
2) data-config.xml 를 작성
색인
21
04
Data-config를 작성하기
1) 리소스 정의
<dataSource name="MysqlConnect" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" u
rl="jdbc:mysql://localhost:3386/seminardb" user=“seminar_user" password=“1234"/>
2) Entity 정의
pk= { 엔티티의 키값 정의}
dataSource={데이터 소스 정의}
query =“Full Import 쿼리 정의"
deltaImportQuery=“deltaQuery에서 리턴된 키값으로 1개 Row를 리턴하는 쿼리"
deltaQuery=“마지막 색인 시간 이후의 변경된 값의 키값을 리턴"
deletedPkQuery=“삭제된 Doc의 키값을 리턴하는 쿼리'"
3) 데이터 베이스 컬럼과 검색엔진 필드 매칭
<field name="Shop_No" column="Shop_No" />
<field name="Shop_Nm" column="Shop_Nm" />
<field name="Menu_Type" column="Menu_Type" splitBy="," />
<field name="Rgn1" column="Rgn1" />
<field name="Rgn2" column="Rgn2" />
<field name="Rgn3" column="Rgn3" />
<field column="$docBoost" />
색인
22
04
색인의 정체
색인
MergeFactor에 의한 세그먼트의 병합 전략
세그먼트를 병합하는 빈도와 크기를 제어
http://blog.mikemccandless.com/2011/02/visualizing-luce
nes-segment-merges.html
23
Chapter 5
검색
24
05
검색 기본 파라메터
검색
q={boolean 검색질의}
fq={필터링된 검색 질의}
fl = {결과값 필드}
rows= {결과 값의 개수}
start= {결과 값 시작 위치}
sort ={결과 값의 정렬 기준}
rows + start + total count = 페이징
25
05
Facet
검색
facet =true
facet.field = facet 대상 필드
facet.mincount = 최소 갯수
facet.limit = 출력 갯수
facet.sort = 출력 순서
26
05
다양한 Facet 기능
검색
필드값 Facet
알파벳 Facet
날짜 Facet
피봇 Facet(Decision Tree)
거리 Facet (Geo Spatial Search)
숫자 Facet
27
05
Geo Spatial 검색
검색
LatLonType (solr-1.4)
PointType (solr-3.X)
SOLR-2155(geoHash) (solr-3.X 패치)
SpatialRecursivePrefixTreeFieldType(Solr 4.0)
=> Polygon Search
http://localhost:8080/solr44/shop/select?q=*%3A*&wt=x
ml&fq={!geofilt%20pt=35.8754666,128.5591111%20sfiel
d=LatLng%20d=3}
28
05
기타 검색 기능들
검색
More-Like-this
Spellcheck
Grouping
29
05
랭킹
검색
1) Query Time Ranking vs Index Time Ranking
- Index Time Ranking
Doc Boost 이용
- Query Time Ranking
기본은 TF – IDF + 필드별 가중치 + Function Query
예) {!boost b=recip(ms(NOW,Reg_Date),3.16e-11,0.08,0.05)}
30
Chapter 6
확장
31
06
복제(replication)
확장
slave slave
master
User Query
32
06
복제(replication)
solrconfig에 설정
확장
- Master
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<str name="replicateAfter">commit</str>
<str name="replicateAfter">startup</str>
<str name="confFiles">schema.xml,stopwords.txt,synonyms.txt</str>
</lst>
</requestHandler>
-Slave
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<str name="masterUrl">{마스터URL}/Shop/replication</str>
<str name="pollInterval">00:00:60</str>
</lst>
</requestHandler>
33
06
샤딩(Sharding)
데이터를 횡으로 나누어 배치하는 전략
확장
검색쿼리
'http://localhost:8983/solr/select?shards=localhost:8983/solr,l
ocalhost:7574/solr&indent=true&q=ipod+solr'
34
06
Replication & Shard
확장
User Query
검색쿼리
User Query
35
Chapter 7
커스트 마이징
36
07
Analyzer 개발
커스트 마이징
Lucene의 분석기 상속 구조
TokenStream
Tokenizer TokenFilter
CharTokenizer
WhiteSpaceTokenizer
LetterTokenizer LowCaseTokenizer
StandardTokenizer
LowCaseTokenFilter
StandardTokenFilter
PorterStemTokenFilter
StopFilter
적당한 지점에서 상속을 받은후
incrementToken() 및 주요 멤버 함수를 오버라이딩
37
07
개발된 Analyzer 를 Solr 에 연결
커스트 마이징
package org.apache.lucene.analysis.jaso;
import java.io.Reader;
import java.util.Map;
//import org.apache.lucene.analysis.kr.KoreanFilter;
import org.apache.lucene.analysis.util.TokenizerFactory;
public class JasoTokenizerFactory extends TokenizerFactory {
private int mode = 0;
private boolean typo = true;
@Override
public void init(Map<String, String> args) {
super.init(args);
mode = getInt("mode", 0);
typo = getBoolean("typo", true);
}
public JasoTokenizer create(Reader input) {
return new JasoTokenizer(luceneMatchVersion,input,mode,typo);
}
}
TokenizerFactory를 상속 받아서 create를 오버라이드 한다.
38
07
성능 개선
커스트 마이징
1) 잘 짜여진 스키마 설계
2) 적절한 Facet, Grouping 기능
3) Solrconfig.xml 에서 캐쉬 설정 튜닝
4) AutoCommit & MergeFactor 설정 튜닝
5) Replicaiton과 Shard을 이용한 확장 전략(CPU 코어 수맊큼의 샤드 운용)
QnA
감사합니다
김지훈
-http://facebook.com/tajimara
-jihoon@queryjet.com
-www.queryjet.com

More Related Content

Similar to 제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈

Solr development case
Solr development caseSolr development case
Solr development case일규 최
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & BeyondJay Lee
 
Jstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJung Han
 
Apache solr소개 20120629
Apache solr소개 20120629Apache solr소개 20120629
Apache solr소개 20120629Dosang Yoon
 
HeadFisrt Servlet&JSP Chapter 13
HeadFisrt Servlet&JSP Chapter 13HeadFisrt Servlet&JSP Chapter 13
HeadFisrt Servlet&JSP Chapter 13J B
 
Servlet jsp 13장
Servlet jsp 13장Servlet jsp 13장
Servlet jsp 13장JeongBong Kim
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020Ji-Woong Choi
 
02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)Hankyo
 
overview of spring4
overview of spring4overview of spring4
overview of spring4Arawn Park
 
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive Elasticsearch
 
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle엑셈
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
Clean code
Clean codeClean code
Clean codebbongcsu
 

Similar to 제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈 (20)

Solr development case
Solr development caseSolr development case
Solr development case
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & Beyond
 
Jstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNG
 
Apache solr소개 20120629
Apache solr소개 20120629Apache solr소개 20120629
Apache solr소개 20120629
 
HeadFisrt Servlet&JSP Chapter 13
HeadFisrt Servlet&JSP Chapter 13HeadFisrt Servlet&JSP Chapter 13
HeadFisrt Servlet&JSP Chapter 13
 
Servlet jsp 13장
Servlet jsp 13장Servlet jsp 13장
Servlet jsp 13장
 
Scala for play
Scala for playScala for play
Scala for play
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
 
02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)
 
overview of spring4
overview of spring4overview of spring4
overview of spring4
 
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
 
Javascript
JavascriptJavascript
Javascript
 
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Html5 performance
Html5 performanceHtml5 performance
Html5 performance
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
스프링 트랜잭션(SpringTransaction)
스프링 트랜잭션(SpringTransaction)스프링 트랜잭션(SpringTransaction)
스프링 트랜잭션(SpringTransaction)
 
Clean code
Clean codeClean code
Clean code
 

Recently uploaded

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 

Recently uploaded (6)

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 

제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈

  • 1. Solr 활용 입문 제 2회 루씬한글분석기 기술세미나
  • 2. 1 다운로드 2 설치 및 실행 3 필드 구성 4 색인하기 5 검색하기 6 확장 7 커스트 마이징
  • 5. 5 01 Solr 의 버전 변화 다운로드 1.4.1 3.0 4.0 alpha 4.4 3.6
  • 7. 7 01 war 풀고 묶기 다운로드 1) Jdbc Connector jar - Oracle http://www.oracle.com/technetwork/database/features/ jdbc/index-091264.html - Mysql http://cdn.mysql.com/Downloads/Connector-J/mysql-co nnector-java-5.1.26.tar.gz - MSSQL http://msdn.microsoft.com/en-us/sqlserver/aa937724.a spx 2) 한글 형태소 분석기 jar 3) 기타 추가 lib 다시 묶기 jar cvf ../solr4.4.0.war *
  • 9. 9 02 Jetty 실행 java -Djetty.port=8080 –jar start.jar 설치 및 실행 Tomcat 실행 1) $TOMCAT_HOME/conf/Catalina/localhost/ 폴더에 solr44.xml 생성 <Context docBase="C:SOLR_HOMEsolr-4.4.0.war" debug="0" crossContext="true" > <Environment name="solr/home" type="java.lang.String" value="C:SOLR_HOMEsolr44" override="true" /> </Context> 2) bin/startup.sh Heap 메모리 늘리기 1) $TOMCAT_HOME/bin/catalina.sh 에 추가 JAVA_OPTS="-server -Xms1500m -Xmx1500m - XX:MaxPermSize=256m"
  • 10. 10 02 실행 후 SOLR GUI 설치 및 실행
  • 12. 12 03 기본 데이터 (우아한 형제들 제공 상점 정보) 1000건) 필드 구성 새로운 코어 생성 SOLR_HOME/solr.xml 수정 <cores adminPath="/admin/cores" host="${host:}" hostPort="${jetty.port:8983}" hostContext="${hostContext:solr}"> <core name="core0" instanceDir="core0" /> <core name="core1" instanceDir="core1" /> <core name="shop" instanceDir="shop" /> <!– 추가  </cores>
  • 13. 13 03 RDBMS vs 검색엔진 필드 구성 데이터베이스 행(Row) 테이블(Table) 컬럼(Column) 스키마 검색엔진 문서(Document) 인덱스(Core) 필드(Field) 스키마(Schema)
  • 14. 14 03 schema.xml 파일 수정 필드 구성 1) 사용할 필드 타입 정의 <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/> <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/> <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/> 2)사용할 필드 정의 <fields> <field name="Shop_No" type="string" indexed="true" stored="true" multiValued="false" required="true"/> <field name="Shop_Nm" type="string" indexed="true" stored="true" multiValued="false" /> <field name="Menu_Type" type="string" indexed="true" stored="true" multiValued="true" /> <field name="Rgn1" type="string" indexed="true" stored="true" multiValued="false" /> <field name="Rgn2" type="string" indexed="true" stored="true" multiValued="false" /> <field name="Rgn3" type="string" indexed="true" stored="true" multiValued="false" /> <field name="LatLng" type="location_rpt" indexed="true" stored="true" multiValued="false" /> <field name="_version_" type="long" indexed="true" stored="true"/> </fields>
  • 15. 15 03 schema.xml 파일 수정 필드 구성 3) 유니크 키를 정의 <uniqueKey>Shop_No</uniqueKey> 4)기본 검색 필드 정의 <defaultSearchField>Shop_Nm</defaultSearchField> 5)기본 연산자 정의 <solrQueryParser defaultOperator="AND"/>
  • 16. 16 03 Analyzer 를 정의 필드 구성 <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
  • 17. 17 03 Analyzer 란? 필드 구성 Lucene에서의 형태소 분석기란? Tokenizer + Filter = Analyzer Tokenizer는 무조건 1개맊 결합 할 수 있다. Filter는 여러 개를 결합 가능하다. Filter는 순서가 중요하다. Tokenizer로 나누어진 것을 Token이라 하고 Filter를 거쳐서 최종적으로 색인시에 사용하는 것을 Term이라 한다.
  • 19. 19 04 REST API 방식 /update 핸들러에 REST 전송 <doc> <field name="Shop_No">1</field> <field name="Shop_Nm">쿼리젯</field> <field name="Rgn1">서울특별시</field> <field name="Rgn2">영등포구</field> <field name="Rgn3">영등포동</field> <field name="LatLng">35.8754666,128.5591111</field> </doc> <delete><id>05991</id></delete> <Commit/> <Optimize/> 색인
  • 20. 20 04 DIH 방식 (Data Import Handler) 1) solrconfig.xml 에 핸들러 정의 <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport. DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler> 2) data-config.xml 를 작성 색인
  • 21. 21 04 Data-config를 작성하기 1) 리소스 정의 <dataSource name="MysqlConnect" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" u rl="jdbc:mysql://localhost:3386/seminardb" user=“seminar_user" password=“1234"/> 2) Entity 정의 pk= { 엔티티의 키값 정의} dataSource={데이터 소스 정의} query =“Full Import 쿼리 정의" deltaImportQuery=“deltaQuery에서 리턴된 키값으로 1개 Row를 리턴하는 쿼리" deltaQuery=“마지막 색인 시간 이후의 변경된 값의 키값을 리턴" deletedPkQuery=“삭제된 Doc의 키값을 리턴하는 쿼리'" 3) 데이터 베이스 컬럼과 검색엔진 필드 매칭 <field name="Shop_No" column="Shop_No" /> <field name="Shop_Nm" column="Shop_Nm" /> <field name="Menu_Type" column="Menu_Type" splitBy="," /> <field name="Rgn1" column="Rgn1" /> <field name="Rgn2" column="Rgn2" /> <field name="Rgn3" column="Rgn3" /> <field column="$docBoost" /> 색인
  • 22. 22 04 색인의 정체 색인 MergeFactor에 의한 세그먼트의 병합 전략 세그먼트를 병합하는 빈도와 크기를 제어 http://blog.mikemccandless.com/2011/02/visualizing-luce nes-segment-merges.html
  • 24. 24 05 검색 기본 파라메터 검색 q={boolean 검색질의} fq={필터링된 검색 질의} fl = {결과값 필드} rows= {결과 값의 개수} start= {결과 값 시작 위치} sort ={결과 값의 정렬 기준} rows + start + total count = 페이징
  • 25. 25 05 Facet 검색 facet =true facet.field = facet 대상 필드 facet.mincount = 최소 갯수 facet.limit = 출력 갯수 facet.sort = 출력 순서
  • 26. 26 05 다양한 Facet 기능 검색 필드값 Facet 알파벳 Facet 날짜 Facet 피봇 Facet(Decision Tree) 거리 Facet (Geo Spatial Search) 숫자 Facet
  • 27. 27 05 Geo Spatial 검색 검색 LatLonType (solr-1.4) PointType (solr-3.X) SOLR-2155(geoHash) (solr-3.X 패치) SpatialRecursivePrefixTreeFieldType(Solr 4.0) => Polygon Search http://localhost:8080/solr44/shop/select?q=*%3A*&wt=x ml&fq={!geofilt%20pt=35.8754666,128.5591111%20sfiel d=LatLng%20d=3}
  • 29. 29 05 랭킹 검색 1) Query Time Ranking vs Index Time Ranking - Index Time Ranking Doc Boost 이용 - Query Time Ranking 기본은 TF – IDF + 필드별 가중치 + Function Query 예) {!boost b=recip(ms(NOW,Reg_Date),3.16e-11,0.08,0.05)}
  • 32. 32 06 복제(replication) solrconfig에 설정 확장 - Master <requestHandler name="/replication" class="solr.ReplicationHandler" > <lst name="master"> <str name="replicateAfter">commit</str> <str name="replicateAfter">startup</str> <str name="confFiles">schema.xml,stopwords.txt,synonyms.txt</str> </lst> </requestHandler> -Slave <requestHandler name="/replication" class="solr.ReplicationHandler" > <lst name="slave"> <str name="masterUrl">{마스터URL}/Shop/replication</str> <str name="pollInterval">00:00:60</str> </lst> </requestHandler>
  • 33. 33 06 샤딩(Sharding) 데이터를 횡으로 나누어 배치하는 전략 확장 검색쿼리 'http://localhost:8983/solr/select?shards=localhost:8983/solr,l ocalhost:7574/solr&indent=true&q=ipod+solr'
  • 34. 34 06 Replication & Shard 확장 User Query 검색쿼리 User Query
  • 36. 36 07 Analyzer 개발 커스트 마이징 Lucene의 분석기 상속 구조 TokenStream Tokenizer TokenFilter CharTokenizer WhiteSpaceTokenizer LetterTokenizer LowCaseTokenizer StandardTokenizer LowCaseTokenFilter StandardTokenFilter PorterStemTokenFilter StopFilter 적당한 지점에서 상속을 받은후 incrementToken() 및 주요 멤버 함수를 오버라이딩
  • 37. 37 07 개발된 Analyzer 를 Solr 에 연결 커스트 마이징 package org.apache.lucene.analysis.jaso; import java.io.Reader; import java.util.Map; //import org.apache.lucene.analysis.kr.KoreanFilter; import org.apache.lucene.analysis.util.TokenizerFactory; public class JasoTokenizerFactory extends TokenizerFactory { private int mode = 0; private boolean typo = true; @Override public void init(Map<String, String> args) { super.init(args); mode = getInt("mode", 0); typo = getBoolean("typo", true); } public JasoTokenizer create(Reader input) { return new JasoTokenizer(luceneMatchVersion,input,mode,typo); } } TokenizerFactory를 상속 받아서 create를 오버라이드 한다.
  • 38. 38 07 성능 개선 커스트 마이징 1) 잘 짜여진 스키마 설계 2) 적절한 Facet, Grouping 기능 3) Solrconfig.xml 에서 캐쉬 설정 튜닝 4) AutoCommit & MergeFactor 설정 튜닝 5) Replicaiton과 Shard을 이용한 확장 전략(CPU 코어 수맊큼의 샤드 운용)
  • 39. QnA