Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
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....
8
Chapter 2
설치 및 실행
9
02
Jetty 실행
java -Djetty.port=8080 –jar start.jar
설치 및 실행
Tomcat 실행
1) $TOMCAT_HOME/conf/Catalina/localhost/ 폴더에
solr44....
10
02
실행 후 SOLR GUI
설치 및 실행
11
Chapter 3
필드 구성
12
03
기본 데이터 (우아한 형제들 제공 상점 정보)
1000건)
필드 구성
새로운 코어 생성
SOLR_HOME/solr.xml 수정
<cores adminPath="/admin/cores" host="${host:...
13
03
RDBMS vs 검색엔진
필드 구성
데이터베이스
행(Row)
테이블(Table)
컬럼(Column)
스키마
검색엔진
문서(Document)
인덱스(Core)
필드(Field)
스키마(Schema)
14
03
schema.xml 파일 수정
필드 구성
1) 사용할 필드 타입 정의
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fie...
15
03
schema.xml 파일 수정
필드 구성
3) 유니크 키를 정의
<uniqueKey>Shop_No</uniqueKey>
4)기본 검색 필드 정의
<defaultSearchField>Shop_Nm</defaul...
16
03
Analyzer 를 정의
필드 구성
<fieldType name="text_general" class="solr.TextField"
positionIncrementGap="100">
<analyzer type...
17
03
Analyzer 란?
필드 구성
Lucene에서의 형태소 분석기란?
Tokenizer + Filter = Analyzer
Tokenizer는 무조건 1개맊 결합 할 수 있다.
Filter는 여러 개를 결합 가...
18
Chapter 4
색인
19
04
REST API 방식
/update 핸들러에 REST 전송
<doc>
<field name="Shop_No">1</field>
<field name="Shop_Nm">쿼리젯</field>
<field name...
20
04
DIH 방식 (Data Import Handler)
1) solrconfig.xml 에 핸들러 정의
<requestHandler name="/dataimport" class="org.apache.solr.ha...
21
04
Data-config를 작성하기
1) 리소스 정의
<dataSource name="MysqlConnect" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" u
r...
22
04
색인의 정체
색인
MergeFactor에 의한 세그먼트의 병합 전략
세그먼트를 병합하는 빈도와 크기를 제어
http://blog.mikemccandless.com/2011/02/visualizing-luce
...
23
Chapter 5
검색
24
05
검색 기본 파라메터
검색
q={boolean 검색질의}
fq={필터링된 검색 질의}
fl = {결과값 필드}
rows= {결과 값의 개수}
start= {결과 값 시작 위치}
sort ={결과 값의 정렬 기준...
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 패치)
SpatialRecursivePrefix...
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 – ID...
30
Chapter 6
확장
31
06
복제(replication)
확장
slave slave
master
User Query
32
06
복제(replication)
solrconfig에 설정
확장
- Master
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<ls...
33
06
샤딩(Sharding)
데이터를 횡으로 나누어 배치하는 전략
확장
검색쿼리
'http://localhost:8983/solr/select?shards=localhost:8983/solr,l
ocalhost:7...
34
06
Replication & Shard
확장
User Query
검색쿼리
User Query
35
Chapter 7
커스트 마이징
36
07
Analyzer 개발
커스트 마이징
Lucene의 분석기 상속 구조
TokenStream
Tokenizer TokenFilter
CharTokenizer
WhiteSpaceTokenizer
LetterToke...
37
07
개발된 Analyzer 를 Solr 에 연결
커스트 마이징
package org.apache.lucene.analysis.jaso;
import java.io.Reader;
import java.util.Ma...
38
07
성능 개선
커스트 마이징
1) 잘 짜여진 스키마 설계
2) 적절한 Facet, Grouping 기능
3) Solrconfig.xml 에서 캐쉬 설정 튜닝
4) AutoCommit & MergeFactor 설정...
QnA
감사합니다
김지훈
-http://facebook.com/tajimara
-jihoon@queryjet.com
-www.queryjet.com
Nächste SlideShare
Wird geladen in …5
×

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

5.859 Aufrufe

Veröffentlicht am

제2회 한글형태소분석기 기술 세니마 발표
에서 첫번째 세션에서 발표했던 발표 자료입니다.

많은 도움이 되시길 바랍니다.

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

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

  1. 1. Solr 활용 입문 제 2회 루씬한글분석기 기술세미나
  2. 2. 1 다운로드 2 설치 및 실행 3 필드 구성 4 색인하기 5 검색하기 6 확장 7 커스트 마이징
  3. 3. 3 Chapter 1 다운로드
  4. 4. 4 01 http://lucene.apache.org/solr/ 다운로드
  5. 5. 5 01 Solr 의 버전 변화 다운로드 1.4.1 3.0 4.0 alpha 4.4 3.6
  6. 6. 6 01 다운로드
  7. 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 *
  8. 8. 8 Chapter 2 설치 및 실행
  9. 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. 10 02 실행 후 SOLR GUI 설치 및 실행
  11. 11. 11 Chapter 3 필드 구성
  12. 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. 13 03 RDBMS vs 검색엔진 필드 구성 데이터베이스 행(Row) 테이블(Table) 컬럼(Column) 스키마 검색엔진 문서(Document) 인덱스(Core) 필드(Field) 스키마(Schema)
  14. 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. 15 03 schema.xml 파일 수정 필드 구성 3) 유니크 키를 정의 <uniqueKey>Shop_No</uniqueKey> 4)기본 검색 필드 정의 <defaultSearchField>Shop_Nm</defaultSearchField> 5)기본 연산자 정의 <solrQueryParser defaultOperator="AND"/>
  16. 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. 17 03 Analyzer 란? 필드 구성 Lucene에서의 형태소 분석기란? Tokenizer + Filter = Analyzer Tokenizer는 무조건 1개맊 결합 할 수 있다. Filter는 여러 개를 결합 가능하다. Filter는 순서가 중요하다. Tokenizer로 나누어진 것을 Token이라 하고 Filter를 거쳐서 최종적으로 색인시에 사용하는 것을 Term이라 한다.
  18. 18. 18 Chapter 4 색인
  19. 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. 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. 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. 22 04 색인의 정체 색인 MergeFactor에 의한 세그먼트의 병합 전략 세그먼트를 병합하는 빈도와 크기를 제어 http://blog.mikemccandless.com/2011/02/visualizing-luce nes-segment-merges.html
  23. 23. 23 Chapter 5 검색
  24. 24. 24 05 검색 기본 파라메터 검색 q={boolean 검색질의} fq={필터링된 검색 질의} fl = {결과값 필드} rows= {결과 값의 개수} start= {결과 값 시작 위치} sort ={결과 값의 정렬 기준} rows + start + total count = 페이징
  25. 25. 25 05 Facet 검색 facet =true facet.field = facet 대상 필드 facet.mincount = 최소 갯수 facet.limit = 출력 갯수 facet.sort = 출력 순서
  26. 26. 26 05 다양한 Facet 기능 검색 필드값 Facet 알파벳 Facet 날짜 Facet 피봇 Facet(Decision Tree) 거리 Facet (Geo Spatial Search) 숫자 Facet
  27. 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}
  28. 28. 28 05 기타 검색 기능들 검색 More-Like-this Spellcheck Grouping
  29. 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)}
  30. 30. 30 Chapter 6 확장
  31. 31. 31 06 복제(replication) 확장 slave slave master User Query
  32. 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. 33 06 샤딩(Sharding) 데이터를 횡으로 나누어 배치하는 전략 확장 검색쿼리 'http://localhost:8983/solr/select?shards=localhost:8983/solr,l ocalhost:7574/solr&indent=true&q=ipod+solr'
  34. 34. 34 06 Replication & Shard 확장 User Query 검색쿼리 User Query
  35. 35. 35 Chapter 7 커스트 마이징
  36. 36. 36 07 Analyzer 개발 커스트 마이징 Lucene의 분석기 상속 구조 TokenStream Tokenizer TokenFilter CharTokenizer WhiteSpaceTokenizer LetterTokenizer LowCaseTokenizer StandardTokenizer LowCaseTokenFilter StandardTokenFilter PorterStemTokenFilter StopFilter 적당한 지점에서 상속을 받은후 incrementToken() 및 주요 멤버 함수를 오버라이딩
  37. 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. 38 07 성능 개선 커스트 마이징 1) 잘 짜여진 스키마 설계 2) 적절한 Facet, Grouping 기능 3) Solrconfig.xml 에서 캐쉬 설정 튜닝 4) AutoCommit & MergeFactor 설정 튜닝 5) Replicaiton과 Shard을 이용한 확장 전략(CPU 코어 수맊큼의 샤드 운용)
  39. 39. QnA
  40. 40. 감사합니다 김지훈 -http://facebook.com/tajimara -jihoon@queryjet.com -www.queryjet.com

×