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

Post on 25-May-2015

2.470 Views

Category:

Technology

8 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

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 al-pha

4.4

3.6

6

01 다운로드

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 *

문서의 제목 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_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"

10

02

실행 후 SOLR GUI

설치 및 실행

문서의 제목 11문서의 제목

Chapter 3필드 구성

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>

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

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

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

색인

22

04

색인의 정체

색인

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

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

http://blog.mikemccandless.com/2011/02/visualizing-lucenes-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=xml&fq={!geofilt%20pt=35.8754666,128.5591111%20sfield=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,localhost: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

CharTok-enizer

WhiteSpaceTok-enizer

LetterTokenizer LowCaseTokenizer

StandardTok-enizer

LowCaseTokenFilter

StandardTokenFil-ter

PorterStemTokenFil-ter

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

top related