solr ๊ฒ์์์ง์ ์ ์ฒด์ ์ธ ํ๋ฆ
solr ๊ฒ์์์ง์ ์ ์ฒด์ ์ธ ํ๋ฆ
solr ๋ ๋ฌด์์ธ๊ฐ
solr ๋
๋ผ๊ณ ๊ณต์ ํํ์ด์ง์ ๋์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ์ฌ์ฉํด ๋ณธ solr๋ search๊ธฐ๋ฅ๊ณผ indexing๊ธฐ๋ฅ์ด ์์ฃผ ์ ๋์ด์๋ ๋๋ค๋ฅธ DB๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
solr์๋ DB์ฒ๋ผ ์ฟผ๋ฆฌ, index, table, column์ด ์๊ณ ์ด๊ฒ๋ค์ DB์ ๊ฐ๋ ๊ณผ ์ ์ฌํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
solr์ ์ ์ฒด์ ์ธ ํ๋ฆ
Analyzer, Tokenizer, Filter
solr์ ๊ฒ์์ด๊ฐ ๋ค์ด์ค๊ฑฐ๋, ์ ์ฅํด์ผ ํ ๋ฐ์ดํฐ๊ฐ ๋ค์ด ์จ ๊ฒฝ์ฐ tokenํ(ํํ์ ๋ถ๋ฆฌ) -> ํํฐ ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
์๋ ์ฝ๋๋ ์ด๋ฌํ ์ผ๋ จ์ tokenizer์ filter๋ฅผ ์ค์ ํ๋ ๋ถ๋ถ์ด๊ณ ๊ฐ core์ *conf/managed-shema* ์์ ๋ณผ ์ ์์ต๋๋ค.
(๊ฐ์ฅ ์์ ์๋ ํ๊ทธ์ธ FiledType์ ๋ํ ๋ด์ฉ์ Indexing ๋ถ๋ถ์์ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.)
analyzer์ ๊ดํ solr documentation
tokenizer์ ๊ดํ solr documentation
filter์ ๊ดํ solr documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<fieldType name="text_ko" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<!-- ํ๊ธ ํ ํฐํ -->
<tokenizer class="solr.KoreanTokenizerFactory" outputUnknownUnigrams="false" decompoundMode="discard"/>
<!-- ๋์์ด -->
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<!-- ์ ์ธํ ๋จ์ด(์กฐ์ฌ) ํํฐ๋ง-->
<filter class="solr.StopFilterFactory" words="stopwords.txt"/>
<filter class="solr.KoreanPartOfSpeechStopFilterFactory"/>
<filter class="solr.KoreanReadingFormFilterFactory"/>
<!-- ์๋ฌธ์๋ก ๋ณํ -->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
|
cs |
๊ฐ ํ ํฌ๋์ด์ ์, ํํฐ๋ฅผ ๊ฑฐ์ณ๊ฐ๋ฉฐ input์ด ๋จ๊ณ๋ณ๋ก ๋ณํํ๋ ๋ชจ์ต์ localhost:8983/#/[core name] ์์ ์ผ์ชฝ์ Analysis ํญ๋ชฉ์ ํตํด ๋ณผ ์ ์์ต๋๋ค.
์๋ ์บก์ณํ๋ฉด์, analysis ํ๋ฉด์์ "์๋ ํ์ธ์, ๋ฐ๊ฐ์์"๋ฅผ ์ ๋ ฅํ์ ๋, ์ด๋ค ํ ํฐ์ด ์ต์ข ์ ์ผ๋ก ๋จ๋์ง ๋ณด์ฌ์ฃผ๋ ํ๋ฉด์ ๋๋ค.
KT, SF ๊ฐ์*์์ด์ฝ์๋* ๋ค์ ๊ฐ๊ฐ ํ ํฌ๋์ด์ ์ ํํฐ๋ค์ ํด๋์ค ์ค์๋ง์ ๋ํ๋ ๋๋ค.
์๋ฅผ๋ค์ด KT ๋ koreanTokenizerFactory ์ ์ค์๋ง์ด๊ณ , LCF ๋ LowerCaseFilterFactory ์ ์ค์๋ง ์ ๋๋ค.
ํ ํฌ๋์ด์ ์ ํํฐ๋ฅผ ํตํด ์ต์ข ์ ์ผ๋ก '์๋ | ๋ฐ๊ฐ'์ด ์ด์ ๋จ์๊ณ , ์ด ๋ ๋จ์ด๊ฐ indexing์ ์ฌ์ฉ๋๊ฒ ๋ฉ๋๋ค.
Indexing
anlyzer๋ฅผ ํตํด์ ์ต์ข ์ ์ผ๋ก '์๋ ํ์ธ์, ๋ฐ๊ฐ์์'๋ผ๋ ๋ฌธ์ฅ์ '์๋ | ๋ฐ๊ฐ' ์ด๋ผ๋ ํ ํฐ์ผ๋ก ์ ์ฅ๋๊ฒ ๋ฉ๋๋ค
DataBase ์ index ๊ฐ๋ ์ฒ๋ผ, solr๋ Indexing ๋ ๊ฒ์ ๋ณด๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ '์์'๋ผ๋ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํด๋, '์๋ ํ์ธ์, ๋ฐ๊ฐ์์' ๋ผ๋ ๋ด์ฉ์ ์ฐพ์ ์ ์์ต๋๋ค.
๋์ '์๋ ', ์ด๋ '๋ฐ๊ฐ' ์ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ๋ค๋ฉด, '์๋ ํ์ธ์, ๋ฐ๊ฐ์์' ๋ด์ฉ์ ์ฐพ์ ์ ์๊ฒ ๋ฉ๋๋ค.
field
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ field ๋ฅผ ๋ง๋๋ ๊ฒ์, ๊ฐ์ ํ์ผ์ธ *managed-schema* ์์ ์๋์ ๊ฐ์ด ์ค์ ํ๊ฒ ๋ฉ๋๋ค.
๊ฐ field ๋ DB ์์์ ํ column์ ์๋ฏธํฉ๋๋ค. filed ์ type์ int, varchar๊ฐ์ ๋ณ์์ ํ์ ์ ๋งํ๋๋ฐ ์ด type์ fieldType ์ name์ ์ ์ ์ ์์ต๋๋ค.
1
2
3
4
5
|
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="round" type="text_ko" indexed="true" stored="true" multiValued="true" />
<field name="class" type="text_ko" indexed="true" stored="true" multiValued="true" />
<field name="question" type="text_ko" indexed="true" stored="true" multiValued="true" />
|
cs |
์ฌ๊ธฐ์
์ ์๋ฏธ๋ type์ด 'text_ko' ์ธ ๊ฒ์ ์๋ฏธํฉ๋๋ค. type์ ๋ฐ๋ผ ์ด๋ค ํํฐ์, ํ ํฌ๋์ด์ ๋ฅผ ๊ฑฐ์น ๊ฒ์ธ์ง๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
์์์ ์ฐ๋ฆฌ๋ 'text_ko' type์ด ์ด๋ป๊ฒ ์ค์ ๋์ด ์๋์ง ๋ณด์์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<fieldType name="text_ko" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<!-- ํ๊ธ ํ ํฐํ -->
<tokenizer class="solr.KoreanTokenizerFactory" outputUnknownUnigrams="false" decompoundMode="discard"/>
<!-- ๋์์ด -->
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<!-- ์ ์ธํ ๋จ์ด(์กฐ์ฌ) ํํฐ๋ง-->
<filter class="solr.StopFilterFactory" words="stopwords.txt"/>
<filter class="solr.KoreanPartOfSpeechStopFilterFactory"/>
<filter class="solr.KoreanReadingFormFilterFactory"/>
<!-- ์๋ฌธ์๋ก ๋ณํ -->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
|
cs |
question field dml field type ์ด 'text_ko'์ด๊ธฐ ๋๋ฌธ์, question์ indexingํ๋ค๋ฉด, question์ ์๋ ๋ด์ฉ๋ค์ ์์ ๋ณธ
tokenizer์ filter๋ค์ ํตํด indexing ๋๊ฒ ๋ฉ๋๋ค.
solr์๋ ํ๊ธ ๋ง๊ณ ๋, ์ธ๊ณ ๊ฐ๊ตญ์ ์ธ์ด๋ค์ ๋ํด analyzer๋ฅผ ์ง์ํด ์ฃผ๊ณ ์์ต๋๋ค. ๋ํ ๋ฌธ์์ธ์ง, ์ซ์์ธ์ง , booleanํ์ ์ธ์ง๋ ๋ค์ํ๊ฒ ์ง์ ํด ์ฃผ๊ธฐ ๋๋ฌธ์ ํ์ํ ๊ฒ์ ๋ง์ถฐ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
(์ฌ์ค ์ต๊ทผ ์ ๋ฐ์ดํธ๋ถํฐ ํ๊ธ์ ๊ธฐ๋ณธ์ผ๋ก ์ง์ํด ์ฃผ์์ต๋๋ค..! ๊ทธ๋์ ์ผ์ด ํจ์ฌ ๊ฐ๋จํด์ก์ต๋๋ค. ๋ง์ธ๐)
Indexing ๊ณผ ๊ฒ์
solr์์๋ **'๊ฒ์์ด ๋ ๋ฐ์ดํฐ'** ์ **'๊ฒ์์ด'** ๋๋ค analyze ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
๋ฐฉ๊ธ ์ฌ์ฉํ analysis ๋ฉ๋ด์์ ์ผ์ชฝ ์ ๋ ฅ์ฐฝ์ '๊ฒ์์ด ๋ ๋ฐ์ดํฐ', ์ค๋ฅธ์ชฝ ์ ๋ ฅ์ฐฝ์ '๊ฒ์์ด'๋ฅผ ์ ๋ ฅํ๋ ๋ถ๋ถ์ ๋๋ค.
์ฐธ๊ณ ๋ก text_ko filedType ์ ๊ฒ์๋ ๋ฐ์ดํฐ ์ ๊ฒ์์ด์ ๋์ผํ analyzer๋ฅผ ์ ์ฉํ์ง๋ง
1
2
|
<analyzer type = "query">...</analyzer>
<analyzer type = "index">...</analyzer>
|
cs |
์์ ์ฝ๋์ฒ๋ผ ์ฟผ๋ฆฌ์ ์ธ๋ฑ์ค ํ ๋์ analyzer๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ ๋ ๊ฐ๋ฅํฉ๋๋ค.
๊ฒ์๋ ๋ฐ์ดํฐ์ ๊ฒ์์ด๊ฐ analyzer๋ฅผ ๊ฑฐ์น๋ ๊ณผ์ ์ analysis ๋ฉ๋ด์์ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ผ์ชฝ์ '์๋ ํ์ธ์ ์ ๋ ์ปคํผ๋ฅผ ์ข์ํด์'๋ฅผ indexingํ ๊ฒฐ๊ณผ์ด๊ณ , ์ค๋ฅธ์ชฝ์ '์ปคํผ๊ธฐ๊ณ'๋ฅผ ๊ฒ์ํ ๋ชจ์ต์ ๋๋ค.
์ต์ข ์ ์ผ๋ก
'์๋ ํ์ธ์ ์ ๋ ์ปคํผ๋ฅผ ์ข์ํด์'๋ผ๋ ๋ฌธ์ฅ์ **'์๋ |์ปคํผ|์ข'** ํ ํฐ์ผ๋ก ์ธ๋ฑ์ฑ์ด ๋์๊ณ ,
์ปคํผ๊ธฐ๊ณ๋**'์ปคํผ|๊ธฐ๊ณ'**๋ผ๋ ํ ํฐ์ผ๋ก ๋๋์ด ์ก์ต๋๋ค.
์ปคํผ๊ธฐ๊ณ์์ '์ปคํผ'๋ผ๋ ํ ํฐ์ด ์๊ธฐ ๋๋ฌธ์, '์ปคํผ๊ธฐ๊ณ'๋ฅผ ๊ฒ์ํ๋ฉด '์๋ ํ์ธ์ ์ ๋ ์ปคํผ๋ฅผ ์ข์ํด์'๋ผ๋ ๊ฒ์๊ฒฐ๊ณผ
๊น์ง ๋์ค๊ฒ ๋ฉ๋๋ค.
๊ฒ์ ๋ฐฉ๋ฒ
์ด๋ ๊ฒ indexing๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์์ฃผ ์ฝ์ต๋๋ค.
solr์๋ฒ์ http ์์ฒญ์ ๋ณด๋ด๋ฉด solr์๋ฒ๋ jsonํํ๋ก ์๋ต์ ๋ณด๋ด์ฃผ๊ฒ ๋ฉ๋๋ค.
DB์๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํด์ ์๋ต์ ๋ฐ์์ค๋ ๊ฒ ์ฒ๋ผ ๋ง์ด์ฃ .
๋ํ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑ ํ ํ์ ์์ด localhost:8983/#/[core name] ์์ query ๋ฉ๋ด์ ์ค๋ฅธ์ชฝ ์ ๋ถ๋ถ์ ๋ณด๋ฉด ์ฟผ๋ฆฌ๋ฅผ ์๋ ค์ค๋๋ค.
์๋ ์บก์ณ ํ๋ฉด์ query ๋ฉ๋ด ํ๋ฉด์ ๋๋ค. ํ๋ฉด์ ์ค๋ฅธ์ชฝ ์์ ๋ณด์ด๋ url ์ฟผ๋ฆฌ ์ญํ ์ ํ๊ฒ ๋ฉ๋๋ค.
์ด url์ ์ฃผ์์ฐฝ์ ์ ๋ ฅํ๋ฉด
๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ง์ฝ python์ ์ฌ์ฉํ๋ค๋ฉด,
1
|
response = requests.get(URL).json()
|
cs |
์ ํตํด ๊ฐ๋จํ response ๋ฅผ ๋ฐ์ ์ฌ ์ ์์ต๋๋ค.
solr์ ์ฟผ๋ฆฌ๋ **์ด๋ฐ๊ฒ๋ ๋ผ?** ์ถ์ ๋งํผ ๋ค์ํ ์ฟผ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
(์๋ฅผ๋ค์ด ํ๊ธ์ ๋ค๋ฅธ ๊ฒ์๊ฒฐ๊ณผ๊น์ง ํฌํจ์ํค๊ฑฐ๋, field(=column) ์ง์ ์์ด ๋ชจ๋ filed ์์ ๊ฒ์ ๋ฑ๋ฑ)
๋ค์ํ ์ฟผ๋ฆฌ์ ๋ํ ๋ ์์ธํ ์ง์์ documentation์ ์ฝ์ด๋ณด๋ฉด ์ ์ ์์ต๋๋ค.
์ถ๊ฐ
์์์ ์ค๋ช ํ์ง ์์ ๋ถ๋ถ์ด ์์ต๋๋ค.
๊ทธ๋์ DB์์ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ๊ฐ์ ธ์ค๋๊ฑฐ์ง?
solr ๋ ๋ค์ํ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ํฉ๋๋ค. ์ ํต์ ์ธ RDB๋ถํฐ jons, xml, NoSQL ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค.
์ ๋ ๊ทธ์ค RDB์ solr๋ฅผ ์ฐ๋ํ์๊ณ , ์๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋์์ ๋ฐ์์ต๋๋ค.
[์ฃผ์] : ํ๊ธ์ด๋ผ๋ฉด DB์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ ์ํด์ผํฉ๋๋ค.
์ด ์ธ์ ๋ค์ํ ๋ฐ์ดํฐ ํ์์ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ documentation์ ์ค๋ช ์ด ๋์ด์์ต๋๋ค.
๋ค์ํ ๋ฐ์ดํฐ ํ์ ๊ฐ์ ธ์ค๊ธฐ
๐