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

40
쿼쿼쿼 (www.queryjet.com)/ 쿼 쿼쿼 Solr 쿼쿼 쿼쿼 쿼 2 쿼 쿼쿼쿼쿼쿼쿼쿼 쿼쿼쿼쿼쿼

Upload: jihoon-kim

Post on 25-May-2015

2.470 views

Category:

Technology


8 download

DESCRIPTION

제2회 한글형태소분석기 기술 세니마 발표 에서 첫번째 세션에서 발표했던 발표 자료입니다. 많은 도움이 되시길 바랍니다.

TRANSCRIPT

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

쿼리젯 (www.queryjet.com)/ 김 지훈

Solr 활용 입문제 2 회 루씬한글분석기 기술세미나

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

1 다운로드2 설치 및 실행3 필드 구성4 색인하기5 검색하기6 확장7 커스트 마이징

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

문서의 제목 3

Chapter 1다운로드

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

4

01

http://lucene.apache.org/solr/

다운로드

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

5

01

Solr 의 버전 변화

다운로드

1.4.1 3.0

4.0 al-pha

4.4

3.6

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

6

01 다운로드

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

7

01

war 풀고 묶기

다운로드

• 알집으로 풀거나• Jar xvf solr-4.4.0.war ( 현위치에 풀림 )

넣고자 하는 jar 를 lib 에 포함시킴/WEB-INF/lib/

1) Jdbc Connector jar - Oracle http://www.oracle.com/technetwork/data-

base/features/jdbc/index-091264.html - Mysql http://cdn.mysql.com/Downloads/Connector-

J/mysql-connector-java-5.1.26.tar.gz - MSSQL http://msdn.microsoft.com/en-us/sqlserver/

aa937724.aspx2) 한글 형태소 분석기 jar3) 기타 추가 lib

다시 묶기jar cvf ../solr4.4.0.war *

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

문서의 제목 8

Chapter 2설치 및 실행

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

9

02

Jetty 실행java -Djetty.port=8080 –jar start.jar

설치 및 실행

Tomcat 실행1)$TOMCAT_HOME/conf/Catalina/localhost/ 폴더에 solr44.xml 생성 <Context docBase="C:\SOLR_HOME\solr-4.4.0.war"

debug="0" crossContext="true" > <Environment name="solr/home" type="java.lang.String"

value="C:\SOLR_HOME\solr44" override="true" /></Context>

2) bin/startup.sh

Heap 메모리 늘리기1)$TOMCAT_HOME/bin/catalina.sh 에 추가 JAVA_OPTS="-server -Xms1500m -Xmx1500m -

XX:MaxPermSize=256m"

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

10

02

실행 후 SOLR GUI

설치 및 실행

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

문서의 제목 11문서의 제목

Chapter 3필드 구성

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

12

03

기본 데이터 ( 우아한 형제들 제공 상점 정보 ) 1000 건 )

필드 구성

새로운 코어 생성

SOLR_HOME/solr.xml 수정<cores adminPath="/admin/cores" host="${host:}" host-

Port="${jetty.port:8983}" hostContext="${hostContext:solr}">

<core name="core0" instanceDir="core0" /> <core name="core1" instanceDir="core1" /> <core name="shop" instanceDir="shop" /> <!– 추가 </cores>

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

13

03

RDBMS vs 검색엔진

필드 구성

데이터베이스

행 (Row)

테이블 (Table)

컬럼 (Column)

스키마

검색엔진

문서(Document)

인덱스 (Core)

필드 (Field)

스키마(Schema)

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

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" positionIncrement-

Gap="0"/><fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncre-

mentGap="0"/><fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncre-

mentGap="0"/><fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIn-

crementGap="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>

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

15

03

schema.xml 파일 수정

필드 구성

3) 유니크 키를 정의

<uniqueKey>Shop_No</uniqueKey>

4) 기본 검색 필드 정의

<defaultSearchField>Shop_Nm</defaultSearchField>

5) 기본 연산자 정의

<solrQueryParser defaultOperator="AND"/>

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

16

03

Analyzer 를 정의

필드 구성

<fieldType name="text_general" class="solr.TextField" positionIncrement-Gap="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>

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

17

03

Analyzer 란 ?

필드 구성

Lucene 에서의 형태소 분석기란 ?

Tokenizer + Filter = Analyzer

Tokenizer 는 무조건 1 개만 결합 할 수 있다 .

Filter 는 여러 개를 결합 가능하다 .

Filter 는 순서가 중요하다 .

Tokenizer 로 나누어진 것을 Token 이라 하고

Filter 를 거쳐서 최종적으로 색인시에 사용하는 것을 Term 이라 한다 .

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

문서의 제목 18

Chapter 4색인

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

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/>

색인

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

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 를 작성

색인

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

21

04

Data-config 를 작성하기

1) 리소스 정의<dataSource name="MysqlConnect" type="JdbcDataSource"

driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3386/semi-nardb" 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" />

색인

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

22

04

색인의 정체

색인

MergeFactor 에 의한 세그먼트의 병합 전략

세그먼트를 병합하는 빈도와 크기를 제어

http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html

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

문서의 제목 23

Chapter 5검색

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

24

05

검색 기본 파라메터

검색

q={boolean 검색질의 }

fq={ 필터링된 검색 질의 }

fl = { 결과값 필드 }

rows= { 결과 값의 개수 }

start= { 결과 값 시작 위치 }

sort ={ 결과 값의 정렬 기준 }

rows + start + total count = 페이징

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

25

05

Facet

검색

facet =true

facet.field = facet 대상 필드 facet.mincount = 최소 갯수

facet.limit = 출력 갯수

facet.sort = 출력 순서

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

26

05

다양한 Facet 기능

검색

필드값 Facet

알파벳 Facet

날짜 Facet

피봇 Facet(Decision Tree)

거리 Facet (Geo Spatial Search)

숫자 Facet

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

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=xml&fq={!geofilt%20pt=35.8754666,128.5591111%20sfield=LatLng%20d=3}

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

28

05

기타 검색 기능들

검색

More-Like-this

Spellcheck

Grouping

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

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)}

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

문서의 제목 30

Chapter 6확장

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

31

06

복제(replication)

확장

slave slave

master

User Query

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

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>

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

33

06

샤딩 (Sharding)

데이터를 횡으로 나누어 배치하는 전략

확장

검색쿼리

'http://localhost:8983/solr/select?shards=localhost:8983/solr,localhost:7574/solr&indent=true&q=ipod+solr'

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

34

06

Replication & Shard

확장

User Query

검색쿼리User Query

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

문서의 제목 35문서의 제목

Chapter 7커스트 마이징

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

36

07

Analyzer 개발

커스트 마이징

Lucene 의 분석기 상속 구조TokenStream

Tokenizer TokenFilter

CharTok-enizer

WhiteSpaceTok-enizer

LetterTokenizer LowCaseTokenizer

StandardTok-enizer

LowCaseTokenFilter

StandardTokenFil-ter

PorterStemTokenFil-ter

StopFilter

적당한 지점에서 상속을 받은후incrementToken() 및 주요 멤버 함수를 오버라이딩

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

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 를 오버라이드 한다 .

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

38

07

성능 개선

커스트 마이징

1) 잘 짜여진 스키마 설계

2) 적절한 Facet, Grouping 기능

3)Solrconfig.xml 에서 캐쉬 설정 튜닝

4)AutoCommit & MergeFactor 설정 튜닝

5)Replicaiton 과 Shard 을 이용한 확장 전략 (CPU 코어 수만큼의 샤드 운용 )

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

QnA