'Elastic'에 해당되는 글 498건

  1. 2013.01.22 stopwords, thesaurus ... 등등
  2. 2013.01.22 루씬 한국어 형태소 분석기 사전 구성 및 팁.
  3. 2013.01.22 한글 stopwords
  4. 2013.01.22 영문 stopwords
  5. 2013.01.18 Elasticsearch search load balancer 구성. 3
  6. 2013.01.16 elasticsearch 색인 생성 스크립트 예제
  7. 2013.01.16 Using Elasticsearch for logs - 활용 팁.
  8. 2013.01.15 elasticsearch + 한국어 형태소 분석기 색인 시 운영 경험 공유.
  9. 2013.01.14 Elasticsearch + 한국어형태소분석기 + JDK 호환 문제. 2
  10. 2013.01.09 elasticsearch query uri 예제들.

stopwords, thesaurus ... 등등

Elastic/Elasticsearch 2013. 1. 22. 18:49

아주 기초가 되는 내용인데.. 웹에서 돌아 다니다가 발견해서 그냥 스크랩해 봅니다.

원본출처는 사이트가 없어진것 같고, 아래 링크에서 퍼왔내요.
http://web.skhu.ac.kr/~mckim1/Lecture/IR/Note/hwork.html


Stopwords(불용어)


불용어란 검색엔진이 검색에서 무시해 버리는 문자열을 의미합니다. 전치사나 관사 a, an, the, that, this, in, on, by, if, is, are, as, be, but, of, for, to, from, with, you, he, there, may 등과 같이 의미없는 단어는 검색어로 취급되지 않는 것입니다.

검색식에 이러한 불용어나 특수기호(마침표,콤마,/,&,%,@,*,? ...)를 반드시 포함시키고자 한다면 대개는 구절검색 기능을 이용합니다. 어떤 검색도구에서는 불용어도 검색대상에 포함시킬 것인지에 대한 옵션을 제공하기도 합니다.



Any terms, Thesaurus
Extended Derivatives

집단검색어,유의어,시소러스, 확장검색


예를 들어 검색을 '대도시'라고 썼을 때 전국의 대도시 지명들을 OR조건으로 모두 나열한 것과 같은 효과를 내는 검색방식입니다. 이것은 집단검색어 파일을 따로 갖고 있는 데이터베이스에서만 사용할 수 있습니다.

비슷한 기능으로서 유의어사전을 지원하는 검색도구들이 있습니다. 대표적인 것이 심마니입니다. 심마니에서는 예를 들어 '장애인#'이라고 검색식을 입력하면 장애인 뿐만 아니라 장애자, 장해인, 장해자 등도 찾아 줍니다. 

이와 같이 사용자가 검색식에 입력한 문자열과 꼭 같지 않더라도 의미상 같거나 관련이 있는 용어들을 모아 검색가능하도록 구축한 데이터베이스를 시소러스(Thesaurus) 또는 유의어사전이라고 합니다.

약간 다르기는 하지만 주제어(Topic) 검색이라는 것이 있습니다. 영어성경검색이 좋은 예입니다. Poor라는 주제어를 입력하면, Beneficence; Giving; Liberality; Orphans; Poverty; Widow 등에 관하여도 볼 수 있습니다. 참고로 Lycos의 카탈로그나 야후의 디렉토리는 메뉴방식으로 원하는 정보를 선택하지만 사실은 내부적으로는 Topic별로 검색이 이루어지는 것입니다.

또 다른 하나의 예는 알파벳 순서에 의한 단어의 범위(Alphabetical Range of Words)를 지정하는 중괄호 { } (braces)입니다. Deja News에서 {monkey monkeying}라고 검색식을 입력하면 영어사전(엄밀히 말하면 Deja News의 색인집인 시소러스)의 monkey부터 monkeying까지 그 사이에 나오는 모든 단어가 검색대상이 됩니다.

Extended Derivatives 

영국의 웹검색기인 WWLib Extended Search Interface는 좀 특별한 확장검색을 합니다. 1.명사의 복수형도 검색하고 (Depluralisation) 2.동사의 분사형이나 진행형도 검색하며 (Degerundisation), 3.관련단어도 검색(Related words)해 주는 것이지요. 예를 들어 biology의 관련어에는 biologist, biologically 등이 있습니다.


Boolean Connectors

부울연산자 : 더하기, 빼기, 곱하기


1. AND

연산자 좌우의 검색어가 모두 나타나는 자료를 찾습니다. (예 welfare and rehabilitation) 

주로 and나 플러스 기호(+)로 표시하지만, 연산자 없이 그냥 공백만으로 and연산을 하거나 그외 엠퍼센드 기호(&)를 쓰는 경우도 있습니다. 심마니에서는 '그리고/와/과/및' 등의 한글 연산자도 사용할 수 있습니다.


2. OR

연산자 좌우의 검색어 중 어느 하나만이라도(any word) 들어 있는 자료를 찾습니다. (예 aged or alzheimer) 

주로 공백이나 or를 사용하지만, 가끔 플러스 기호(+)나 콤마(,)를 사용하기도 합니다. 검색도구에 따라서는 적합성(Relevancy) 점수를 부여할 때 or연산자 좌우의 단어가 모두 들어 있는 자료에 높은 점수를 주기도 합니다.


3. NOT 또는 AND NOT

연산자 앞쪽의 검색어를 포함하되, 뒤쪽의 검색어는 들어있지 않은 자료만 찾습니다. (예 retardation not illness) 

주로 마이너스 기호(-)나 not를 많이 사용하지만, 느낌표(!)나 &!를 사용하기도 합니다.



Phrase Searching

구절검색


두개 이상의 단어가 순서대로 연속해서 나오는 것을 찾습니다. 

예 "special education for the disabled children" 

보통 구절을 따옴표(" ")로 싸 주는데, 검색엔진은 이 구절을 하나의 긴 문자열로 취급하는 것이지요. 주로 두 단어 이상으로 되어 있는 전문용어 등을 찾을 때 사용하지만, 검색 문자열에 특수기호(마침표,콤마,/,&,%,@,*,? ...)나 불용어까지 포함시키려는 경우에도 사용합니다.


※ 구절검색을 할 경우 절단검색 기호(*)는 사용할 수 없고 불용어가 아닌 단어를 두개 이상 포함해야 합니다.


Grouping by Parentheses

검색식의 문법


인터넷의 검색도구들에서도 대체로 여러개의 검색어와 연산자들을 결합하여 복잡한 검색식을 사용할 수 있습니다. 그러나 대개는 상용 데이터베이스와는 달리 and연산자가 or연산자보다 우선되는 것도 아니고 그저 검색식의 왼쪽으로부터 오른쪽으로 차례대로 연산하는데, AltaVista처럼 괄호를 사용하여 검색 연산순서를 바꿀 수 있는 것도 있습니다.

예를 들어, 검색식을 vocational and training or placement (알타비스타라면 +vocational +training placement라고 쓰겠죠.)라고 입력하면 vocational과 training이 동시에 들어 있거나, placement가 들어 있는 자료를 찾습니다. 앞에서부터 차례대로 연산하기 때문입니다. 만약 장애인의 직업훈련이나 직업알선(배치)에 관한 자료를 원한다면 vocational AND (training OR placement) 와 같이 우선 연산하고자 하는 부분을 괄호로 그룹지어야 합니다. 이와 같이 괄호로써 연산자의 조합을 조정할 수 없는 검색도구에서라면 AND조건이 필요한 검색어를 뒤로 보내어 training OR placement AND vocational와 같이 입력하는 것이 좋습니다. AltaVista라면 training placement +vocational 이렇게 입력해야겠지요.



Proximity Searching, Concatenation

인접연산자


인접연산자는 앞뒤의 검색어가 동시에 나와야 한다는 점에서 and연산과 비슷하지만 두 검색어가 바로 옆에 또는 일정 거리내에 인접하여 있어야 합니다. Welfare-Net,Korea와 같은 구조의 문자열을 찾으려면 주로 따옴표로 전체를 묶어 하나의 구절로 검색하는 것이 보통이지만 구절검색이 지원되지 않을 때에는 하이픈(-)이나 콤마(,) 등 특수기호나 불용어 자리에 인접연산자를 쓰면 좋습니다.

※ 앞뒤 검색어가 얼마나 가까이 붙어 있어야 하는가, 두 검색어 사이에 몇개까지의 단어가 끼어드는 것을 허용하는가 하는 인접정도는 검색도구에 따라 조금씩 다릅니다. 100단어 이내, 5글자 이내, 또는 한 문단내에 인접해 있는 조건으로 해석되기도 합니다.

※ 인접연산자는 보통 하나의 검색식 내에서 하나만 사용할 수 있습니다. 여러개의 인접연산자로 구성된 검색식은 거의 허용되지 않을 뿐 아니라 그렇게 써야 할 경우도 거의 없습니다. 또한 구절검색식과 인접연산자를 함께 사용할 수 없습니다.


 검색어간의 순서까지 지정하는 ADJacent, 또는 Preceding

연산자 좌우의 검색어가 지정된 순서로 인접해 들어 있는 자료를 찾습니다. 다이얼로그의 Within 연산자와 같습니다.


예1 mental adj retardation Adj는 Adjacent(인접한)의 약자입니다.

예2 : attitude p3 disab* REHABDATA에서는 절단검색어는 인접연산자와 함께 사용할 수 있으나 구절검색어는 인접연산자와 함께 쓸 수 없습니다. 여기서 p는 preceding(앞에 오는)의 약자로 쓰였습니다.


검색어간의 인접관계만 지정하는 NEAR

이는 좌우 검색어가 앞뒤 순서에 관계없이 인접해 있는 경우를 말합니다. 다이얼로그의 Near 연산자와 같은 것이지요.


예1 : aged near/25 "day care" (WebCrawler)

예2 : welfare ^10 reform (Deja News) Deja News에서는 구절검색어나 절단검색어를 인접연산자와 함께 사용할 수 없습니다.

예3 : attitude w3 disab* (REHABDATA) REHABDATA에서는 절단검색어는 인접연산자와 함께 사용할 수 있으나 구절검색어는 인접연산자와 함께 쓸 수 없습니다. 여기서 w는 Within의 약자로 쓰였습니다. attitude for the disabled의 경우 w3을 써야 합니다. 즉, 인접연산기호와 함께 쓰이는 숫자에는 끝 단어도 계산되는 것입니다.



Truncation

절단검색


검색식에 입력된 문자열과 정확히 일치하는 단어를 찾아내는 것을 완전검색(Precise Searching)이라고 합니다. 검색도구에 따라 Whole words, Complete words, 똑같은거, Exact, Word based search 등으로 표현하는 옵션을 제공하기도 합니다. 예를 들어 입력된 용어가 'handicap'이면 정확히 handicap만 찾으므로, handicapped는 검색되지 않습니다.

검색식에 입력된 문자열로 시작하는 단어는 모두 검색해 준다든가 하는 기능을 절단검색이라고 합니다. 절단검색에는 검색어 뒷부분의 변화를 허용하는 우절단을 비롯하여 앞부분의 변형을 허용하는 후방일치 검색 등이 있습니다.


전방일치검색=어근검색=우절단검색 Right-Truncation

표현형식 : 단어* (또는 %단어) 

절단검색 옵션을 선택하거나 검색어 뒤에 절단기호를 덧붙입니다. 절단기호(가변글자기호)로는 대부분 별표(*)를 사용하지만, 임의의 글자 수만큼 물음표를 사용하는 경우도 있습니다. 한편, 검색식에서는 절단기호(*)를 쓰지 않고 우절단검색, Word-stem based search, Substrings, Start with, 전방일치검색 등으로 표시한 옵션을 선택하게 되어 있는 검색시스템들도 많습니다. 단순히 절단검색이라고 하면 이 우절단검색을 의미한다고 보셔도 됩니다.

예 : disab*

용도 : 검색용어의 끝부분을 임의의 문자로 지정하는 것으로서, 영어의 경우에는 주로 단수형과 복수형(disability, disabilities / child, children)을 한꺼번에 검색하거나, 품사의 차이로 어미변화를 일으키는 용어(volunteer, volunteering, voluntary)를 검색할 때 사용하고, 우리말과 일본어의 경우 앞이 같은 말로 시작되는 유사어나 복합어(장애, 장애인, 장애인복지, 장애자, 장애인시설, 장애연금)를 검색하고자 할때 이용합니다.


후방일치 : Left-Truncation

표현형식 : *단어 (또는 단어%) 

대부분 별표(*)를 사용하지만, 임의의 글자 수만큼 물음표를 사용하는 절단방식도 있습니다. 인터넷상의 거의 모든 검색도구들이 후방일치 절단검색을 지원하지 않습니다. 영국의 웹검색기인 WWLib Extended Search Interface에서는 이 기능을 지원합니다.

예 : 정보탐정에서 검색식을 '장애%'라고 쓰면 지체장애, 청각장애, 시각장애 등 '장애'로 끝나는 용어들을 찾아 줍니다.

용도 : 검색용어의 시작부분을 임의 문자열로 지정하는 것으로서, 영어단어의 경우 주로 화합물의 검색을 위해 사용한다고 하는데, 위의 예와 같이 이 검색식은 한글 복합어를 검색할 때 특히 유용합니다.


사이에 끼는 가변글자

표현형식 : 단어?단어

예 : wom?n

용도 : women, woman을 찾습니다. 다이얼로그와 같은 데이터베이스에서 주로 사용하는 것인데, 인터넷상의 정보검색엔진에서는 이런 검색방식을 지원하는 경우가 거의 없습니다. 다만 이와는 다르지만 영국의 웹검색기인 WWLib Extended Search Interface에서는 앞뒤로 절단검색하는 기능도 있습니다.


절단검색시 주의사항

절단검색어를 사용할 때, 어간이 짧은 경우에는 관계없는 용어들이 같이 검색되므로 어근을 너무 짧게 지정하지 않도록 주의하여야 합니다. 예를 들어, communication, communicate등 의사소통에 관한 자료를 찾기 위해 검색식을 com*이라고 쓰면 community, computer, compass, coma, commercial ...등 전혀 원하지 않는 용어들까지, 또는 너무 많은 용어들이 검색대상이 되어 버립니다.



Field (Context) Searching

필드 제한 검색


웹문서의 title, head, body, address 등이나 뉴스그룹 기사의 author, subject, newsgroup name 등 문서의 특정 부분(필드 또는 context라고 함)으로 제한하여 검색하면 보다 정확하고 빠르게 검색할 수 있습니다.


필드제한 검색의 유형

검색식에 직접 필드제한자를 붙이는 경우 

가장 유연한 검색방식입니다. 고급 서처들에게는 검색식내에 직접 여러 연산기법들을 사용할 수 있게 하는 엔진이 좋은 법이지요. 

예1 : AltaVista(예: title:"Department of Health and Human Services") 알타비스타의 필드제한 검색 특히, title, url, link필드에서의 검색은 정확한 자료를 찾아내는데 큰 도움이 됩니다. 그리고 이것은 과거에 책갈피를 만들어 둔 좋은 자료가 URL의 무단변경으로 인하여 더 이상 찾아내기 어려울 때 아주 유용한 검색기법입니다. 예를 들어 +url:sprc +title:"Social Policy Research Centre"의 검색은 지금의 정확한 주소는 모르지만 url과 타이틀중에 포함된 단어로써 찾아내는 것입니다. 

나의 홈페이지,웹문서를 다른 곳들에서 얼마나 많이 링크시켜놓고 있는지를 알고 싶을 때 +link:http://welfare.or.kr -host:welfare.or.kr 이와 같이 검색식을 입력하면 됩니다. 

예2 : Deja News(예: ~g alt.child*)

검색식을 입력한 다음 검색대상 필드를 옵션으로 선택하는 경우 

예1 : Galaxy 

예2 : OpenText Power Search

필드별 검색식 입력상자에 검색식을 작성하는 경우 

예1 : REHABDATA 

예2 : 유럽사회과학정보협의회 통합검색 CESSDA


필드내에서의 비교연산자 Comparison and Range Searches 

필드검색에 있어서, 특히 위의 세번째 유형처럼 각 필드별로 검색식 입력상자가 따로 있는 경우는 좀더 진보된 고급 연산자를 지원하는 것도 있습니다.(예:REHABDATA) 인터넷상의 일반 검색엔진에서는 좀처럼 보기 어려운 연산자이기는 하지만 고급 문헌검색엔진(Dialog, BRS ...)이나 일반 DBMS(dBASEIII+, Approach...)에서는 다 지원되는 것입니다.

연산자기호


의미


예제

=

Equal to (exact match)

=access


>

Greater than

>5500


>=

Greater than or equal to

>=5500


<

Less than

<1-Jan-1996


<=

Less than or equal to

<=TX


:

Within range

1993:1996


※ 주의사항

비교연산자는 수치의 대소뿐만 아니라, 문자열의 알파벳 순서(엄밀히 말하면 코드값), 날짜의 선후를 비교하는데에도 사용됩니다.

Equal to 연산자(=)는 해당 필드내에 정확히 그 문자열만 들어 있어야 한다는 것입니다. 다른 단어(들)이 더 있어서도 안되는 것입니다. 이는 해당 필드내에 들어 있는 여러 단어 중 하나에 대하여 좌우 첨가없이 정확히 일치하는 Whole word(절단검색의 반대)를 찾는 것과는 또 다른 것입니다.

범위(range)연산기호 :대신에 ..등을 사용하기도 합니다.

REHABDATA는 날짜필드에서 비교연산자와 함께 날짜값의 일부만 쓰는 경우, 즉 년월일을 다 적지 않고 년도나 월만 쓰는 경우에는 해당 년도 또는 월의 첫날부터 찾는 것으로 간주합니다. 그리고 날짜형식은 거의 모든 형식을 다 지원하지만 or연산자와 혼동될 수 있는 slash (/)는 쓰지 마십시오. 슬래시를 사용할 경우는 날짜 전체를 따옴표로 묶어야 합니다(예:"6/25/1996"). June 1995 또는 6-95와 같이 쓰시면 무난합니다.



Relevancy, Weight

적확도,정확성,우선순위


히트(hit) 

검색결과 추출된 자료 또는 그 건수를 히트(hit)라고 합니다. 예를들어, 사용자가 입력한 검색식의 조건에 맞는 자료가 1,000건이 나왔을 경우 "1,000건이 hit되었다"라고 표현합니다. 이 경우 히트수는 1,000건이 되는 것이지요.

적합성(relevancy) 또는 우선순위(weight) 

적합성이란 히트된 자료내에 우리가 요구한 검색어가 얼마나 중요한 곳에 들어 있는가? 또는 얼마나 많이 그리고 얼마나 여러번 나오는가? 등을 기준으로 계산하는 정확성의 척도입니다. 예를 들어 웹문서의 타이틀이나 헤드 영역에 해당 단어가 들어 있거나 자료 중에 우리가 입력한 검색식에 딱 맞는 문자열(들)이 들어 있거나 같은 검색어라도 문장 중에 여러번 나온다면 우리가 원하는 자료일 가능성이 높다는 뜻이 된다는 것입니다.

정확도를 평가하는 기준은 검색엔진에 따라 조금씩 다릅니다. 몇가지만 예를 들어 봅시다.


라이코스는 입력된 검색어들간의 인접정도와 출현빈도에 따라 적합성의 점수를 매깁니다. loose match는 적합성점수가 0.1이상인 자료를 찾아주고, 가장 높은 strong match는 0.9이상인 자료만 보여줍니다. 검색결과수(hit)나 적합성의 차이도 있지만 검색소요시간도 크게 차이나는데, strong match를 선택하면 아주 빨리 결과를 보실 수 있습니다.

마젤란은, 검색식에 입력된 검색어들 중에 몇개나 맞추는가와 출현횟수, 검색어가 웹문서의 Title(넷스케이프의 제목막대에 표시되는 문자열)이나 URL 또는 마젤란의 Review에 들어 있는가 를 기준으로 적합성의 점수를 부여합니다. 그리고 검색결과는 이 적합성이 높은 자료부터 표시됩니다.

기타 알타비스타나, 심마니, 미국 정부기록,간행물 데이터베이스 등의 경우도 비슷한 방법으로 정확성을 계산하고 결과에 그 값을 표시하되, 대개는 바로 이 적합성의 점수 순으로 정렬하여 보여줍니다.

적합성과 혼동되기 쉬운 것으로, 소위 사이트의 점수 (Rating)가 있습니다. 예를 들어, 마젤란 경우, 각 사이트를 평가하여 사용의 용이성, 갱신주기, 편집기술, 흥미유발정도 등을 기준으로 점수를 부여하고 그 결과를 별표(one to four stars)로 표시하는데, 별표가 많으면 점수가 높은 것입니다. 그러나 이 점수가 우리가 찾고자 하는 검색식에 얼마나 적합한가를 의미하지는 않습니다. 단지 그 사이트가 일반적으로 좋은 곳이냐 하는 것을 의미할 뿐입니다. 개별 자료의 정확도와는 전혀 다른 의미의 점수인 것입니다.


:

루씬 한국어 형태소 분석기 사전 구성 및 팁.

Elastic/Elasticsearch 2013. 1. 22. 14:25

원본출처 : http://cafe.naver.com/korlucene


형태소사전은 모두 8개로 구성되어 있습니다. 그 중 하나는 음절정보이므로 실제로는 7개로 봐야 하겠군요.

사전은 org/apache/lucene/analysis/kr/dic 아래에 있습니다.

이 사전은 모두 jar 에 함께 패키징되어 있는데, KoreanAnalyzer 는 우선 classpath 에 있는 파일에서 찾고

없으면 jar 에 패키징되어 있는 것을 읽어 옵니다. 따라서 커스터마이징된 사전을 사용하고자 한다면

%CLASSPATH%/org/apache/lucene/analysis/kr/dic 아래에 각자의 사전을 저장해서 사용하면 됩니다.

 

각 사전에 대한 자세한 설명은 다음과 같습니다.

 

1. total.dic : 기본사전

용언과 체언을 포함한 기본사전입니다. 사전의 형식을 보면 다음과 같이 구성되어 있습니다.

================

납부,10011X

================

콤마(,)를 중심으로 좌측은 단어이고 우측은 단어정보입니다.

단어정보는 6글자로 구성되어 있는데 각 글자는 단어의 사용규칙을 나타내며 아래와 같습니다.

=========================================================

  1      2         3            4             5             6

명사 동사  기타품사  하여동사  되어동사  불규칙변형

=========================================================

1~3은 품사에 대한 정보이며, 위에 기술한 각 품사 여부를 나타냅니다.

4~5는 명사인 경우 "하다"와 "되다"가 붙을 수 있는 경우를 나타납내다. 주의)동사는 반드시(0)이어야 합니다.

6은 동사인 경우 불규칙변형의 종류를 나타내며 종류는 아래와 같습니다.

    B:ㅂ 불규칙, H:ㅎ 불규칙, L:르 불규칙, U:ㄹ 불규칙, S:ㅅ 불규칙, D:ㄷ 불규칙, R:러 불규칙, X:규칙

 

2. extension.dic : 확장사전

기본사전은 가능한 그 대로 사용하는 것이 좋을 것입니다. 그런데 사전을 조금 보완하여야 할때 확장사전을

사용하면 됩니다. 사전을 구성하는 규칙은 기본사전과 동일합니다.

 

3. josa.dic : 조사사전

조사들만 모아둔 사전입니다. 각 조사는 한줄씩 구분되어 있습니다.

 

4. eomi.dic : 어미사전

어미들만 모아둔 사전입니다. 각 어미는 한줄씩 구분되어 있습니다.

 

5. prefix.dic : 접두어 사전

복합명사를 분해시 2글자 이상의 단어로만 분해합니다. 그러나 "과소비" 같은 경우 "과"를 접두어로 분리해 내어

"과소비"와 "소비"를 색인어로 추출하기 위해 만든 사전입니다.

 

6. suffix.dic : 접미어 사전

복합명사를 분해 시 "현관문" 같은 경우 "문"을 접미어로 분해하여 "현관문"과 "현관"을 색인어로 추출하기 위해

만든사전입니다.

 

7. compounds.dic : 기분석 복합명사 사전

복합명사는 명사 사전을 기반으로 최장일치법에 의해 분해를 합니다. 그런데 "근로자의날" 같은 경우 중간에 조사가

포함되어 있으므로 분해가 불가능합니다. 이런 경우 복합명사 사전에 등록을 합니다. 규칙은 아래와 같습니다.

=========================================

근로자의날:근로자,날

=========================================

콜론(:)을 중심으로 좌측은 복합명사이고 우측은 함께 추출될 색인어입니다. 따라서 위의 경우는 색인어로

"근로자의날","근로자","날" 이렇게 3개가 추출됩니다.

 

 

 

:

한글 stopwords

Elastic/Elasticsearch 2013. 1. 22. 11:27

정말 오랜만에 보내요.. 
제가 야후에 있을때 봤던 것 같은데.. 국민대 강승식 교수님의 한국어 형태소 분석기... 

[한글 Stopword]

https://github.com/wonderino/KeywordElection2012/blob/master/hdic/stopword.dic

;
;====================[ 불용어 및 특수색인어 사전 ]======================
;
; 불용어(stopword)는 자동색인시에 색인어로 추출되지 않도록 하고 싶은
; 명사들입니다. 즉, 이 파일에 등록된 stopword들은 색인어로
; 출력되지 않습니다.
;
; 특수색인어는 자동색인시에 1 음절 명사 혹은 숫자로 시작되는
; 용어가 누락되는 것을 방지하기 위한 것으로 특수색인어로 등록되면
; 항상 색인어로 추출해 줍니다.
;
;
; *. 이 파일은 반드시 KS 완성형(KS C 5601-1987) 한글코드로 작성되어야 합니다.
;
; 2. line의 첫문자가 ';'이면 comment로 간주하여 무시됩니다.
;
; 3. line의 첫문자가 '_'이면 불용어로서 색인어로 출력되지 않습니다.
;
; 4. line의 첫문자가 '*'이면 특수색인어로서 항상 색인어로 출력됩니다.
; 1 음절 명사(예: 꽃, 핵)나 숫자로 시작되는 용어(예: 3.1절) 등
; default로 불용어로 간주되는 용어가 누락되지 않게 할 때 사용합니다.
;
; 5. 색인어로 추출되지 않는 한글 명사를 특수색인어로 등록해도
; 여전히 누락되는 경우가 있습니다. 이러한 용어는 특수색인어로
; 등록하지 말고 사용자 정의사전(hangul.usr)에 등록하면 됩니다.
;
; 6. 한 line에 하나의 단어(명사)만 허용되며, line 중간에 blank 문자를
; 허용하지 않습니다.
;
; 7. Text editor로 삽입/삭제할 때 반드시 sorting 순서를 지켜야 합니다.
; sorting 순서가 틀리면 실행할 때 error message를 출력합니다.
;
; 8. 이 사전에 수록될 수 있는 최대 단어수는 10,000단어까지이며,
; 또한 총 60,000bytes를 넘지 않아야 합니다. comment는 제외함.
;
;
; 국민대학교 컴퓨터학부 강승식
;---------------------------------------------------------------------
;--.|_ / /| Seung-Shik Kang Tel: (+82-2) 910-4800
; / | /\ /\| Kookmin University Fax: (+82-2) 910-4868
; ---- -+ School of Computer Science sskang@cs.kookmin.ac.kr
; () () | Songbuk-gu, Seoul 136-702, KOREA http://nlp.kookmin.ac.kr
;---------------------------------------------------------------------
;
*112
*114
*119
*12-12
*12-12사태
*12.12
*12.12사태
*128메가
*16메가
*1기가
*2000
*2002
*256메가
*3-1절
*3.1절
*386
*386PC
*4-19
*4-19혁명
*4.19
*4.19혁명
*486
*486PC
*4메가
*5-16
*5-16혁명
*5.16
*5.16혁명
*5.17
*5.18
*586
*586PC
*6.25
*6.25사변
*64메가
*911
*D램
;1IBM연구소
*S램
_a
_about
_above
_across
_after
_against
_all
_almost
_alone
_along
_already
_also
_although
_always
_among
_an
_and
_another
_any
_anybody
_anyone
_anything
_anywhere
_are
_area
_areas
_around
_as
_ask
_asked
_asking
_asks
_at
_away
_b
_back
_backed
_backing
_backs
_be
_became
_because
_become
_becomes
_been
_before
_began
_behind
_being
_beings
_best
_better
_between
_big
_both
_but
_by
_c
_came
_can
_cannot
_case
_cases
_certain
_certainly
_clear
_clearly
_come
_could
_d
_did
_differ
_different
_differently
_do
_does
_done
_down
_downed
_downing
_downs
_during
_e
_each
_early
_either
_end
_ended
_ending
_ends
_enough
_even
_evenly
_ever
_every
_everybody
_everyone
_everything
_everywhere
_f
_face
_faces
_fact
_facts
_far
_felt
_few
_find
_finds
_first
_for
_four
_from
_full
_fully
_furhered
_further
_furthering
_furthers
_g
_gave
_general
_generally
_get
_gets
_give
_given
_gives
_go
_going
_good
_goods
_got
_great
_greater
_greatest
_group
_grouped
_grouping
_groups
_h
_had
_has
_have
_having
_he
_her
_here
_herself
_high
_higher
_highest
_him
_himself
_his
_how
_however
_i
_if
_important
_in
_interest
_interested
_interesting
_interests
_into
_is
_it
_its
_itself
_j
_just
_k
_keep
_keeps
_kind
_knew
_know
_known
_knows
_l
_large
_largely
_last
_lastest
_later
_leastless
_let
_lets
_like
_likely
_long
_longer
_longest
_m
_made
_make
_making
_man
_many
_may
_me
_member
_members
_men
_might
_more
_most
_mostly
_mr
_mrs
_much
_must
_my
_myself
_n
_necessary
_need
_needed
_needing
_needs
_never
_new
_newer
_newest
_next
_no
_nobody
_non
_noone
_not
_nothing
_now
_nowhere
_number
_numbered
_numbering
_numbers
_o
_of
_off
_often
_old
_older
_oldest
_on
_once
_one
_only
_open
_opened
_opening
_opens
_or
_order
_orderd
_ordering
_orders
_other
_others
_our
_out
_over
_p
_part
_parted
_parting
_parts
_per
_perhaps
_place
_places
_point
_pointed
_pointing
_points
_possible
_present
_presented
_presenting
_presents
_problem
_problems
_put
_puts
_q
_quite
_r
_rather
_really
_right
_room
_rooms
_s
_said
_same
_saw
_say
_says
_second
_seconds
_see
_seem
_seemed
_seeming
_seems
_sees
_several
_shall
_she
_should
_show
_showed
_showing
_shows
_side
_sides
_since
_small
_smaller
_smallest
_so
_some
_somebody
_someone
_something
_somewhere
_state
_states
_still
_such
_sure
_t
_take
_taken
_than
_that
_the
_their
_them
_then
_there
_therefore
_these
_they
_thing
_things
_think
_thinks
_this
_those
_though
_thought
_thoughts
_three
_through
_thus
_to
_today
_together
_too
_took
_toward
_turn
_turned
_turning
_turns
_two
_u
_under
_until
_up
_upon
_us
_use
_used
_uses
_v
_very
_w
_want
_wanted
_wanting
_wants
_was
_way
_ways
_we
_well
_wells
_went
_were
_what
_when
_where
_whether
_which
_while
_whole
_whose
_whoss
_why
_will
_with
_within
_without
_work
_worked
_working
_works
_would
_x
_y
_year
_years
_yet
_you
_young
_younger
_youngest
_your
_yours
_z
_가
_가운데
_갈
; _갑
_걔
_거
_건
; _걸
_것
_게
_겨
_겸
_겹
_경
_곁
_계
_고
_곱
_곳
_곳곳
_과
_곽
_굄
_구
_권
_그
_그간
_그것
_그곳
_그녀
_그달
_그당시
_그대
_그대신
_그동안
_그들
_그들대로
_그때
_그런고
_그런날
_그런데서
_그런줄
_그럴수록
_그로
_그무렵
_그외
_그이
_그전
_그전날
_그쪽
_근
*글
_급
_깁
_깡
*꽃
; _꽝
_끗
_낌
_나
_낙
_낟
_낱
_내게
_내년초
_내달
_내부
_냥
_너
_너나마
_너로
_너와
_너희
_너희대로
_너희들
_네
_네번
_네째
_네탓
_넷
_넷째
_년
_년간
_년도
_녘
_노
_놉
_누가
_누구
_누구누구
_누군가
_뉘
_닢
_다섯째
_다음달
_다음주
_닥
; _답
_당분간
_대다수
; _댁
; _덤
_덧
_데
; _돗
_되
_두
_둔
_둘
_둘째
_둥
_뒤
_뒷받침
_듯
_등
_따름
_따위
_딴
_때
_때문
; _땡
_떼
_뜀
; _런
; _룰
; _룸
_리
_릴
_마
_마련
_마리
; _마지막
_마찬가지
_막
_만
; _만원
; _만원씩
_만큼
_맏
; _맘
; _맴
_메
_멸
_몇
_무엇
_묶음
_물론
_뭇
_뭣
_밑
; _바
_밖
; _백
; _백만
; _백만원
_밸
_번
_번째
별안간
; _볏
; _본
; _봉
; _분
; *비타민A
; *비타민B
; *비타민C
; *비타민D
; *비타민E
_빈
; _빔
; _빽
; _뻥
; _뼘
_뿐
_사
; _삭
; _삵
_샅
_서
_서로
_석
_섟
; _섶
_세
_세째
; _셈
_셋
_셋째
; _송
_수
_수십
_수십개
; _숱
_쉬
_스스로
_승
; _쌈
; _쌍
_씀
; _씹
아홉째
_안
_앎
_압
_앵
_야
_얘
_어느편
_어디
_어디론지
_어떤때
; _억원
_여
_여러가지
_여럿
_여섯째
_열째
; _예
_예년때
_오
_온
_올
_올해
; _옴
; _옹
_왜
_요즘
_우
; _우리
_우리들
_우선
_운운
_움
_움직임
*웹
_위해서
; *윈도95
; *윈도95시스템
; *윈도NT
_유
_육
_율
_으뜸
; _을
_음
_이것
_이곳
_이기
_이날
_이달
_이달초
_이듬
_이듬달
_이때
_이런저런
_이런줄
_이번
_이번분
_일곱째
; _임
_잇
; _작
; _잔
_잘
; _잭
; _잽
; _쟁
_쟤
_저것
_저곳
_저기
_저기대
_저긴
_저도
_저런날
_저런줄
_저렴
_저마
_저쪽
_저하
_저희
_적극적
_전날
_전년
_전부
_전부문
_전일
_전체적
_절절
; _접
_제
_제나름
; _존
; _좆
; _좌
; _죄
_줄곳
; _줌
_중점적
; _쥔
_증
_지
_지난해
_직
_짓
_쪽
; _찬
; _채
; _챙
; _척
; _천만
; _천명
; _천원
_첫날
_첫째
; _촉
_최
_최근
; _충
_취
_층
_치
; _칭
; _칸
; _캡
_컷
; _켜
; _콕
_쾌
; _쿡
;_크기
; _큰폭
; _킥
_타
_탓
_태
; _토
_톡
; _톤
_톨
; _톳
; _퇴
_투
_퉁
; _판
; _패
; _팽
*페르시아만
_편
_평
;_평상시
; _폼
_푸르름
; _푼
; _필
_하
_하나
_하나둘
_한
_한가운데
_한가지
_한곳
; *한국HP
; *한국IBM
; *한국IBM연구소
_한마디
_한번
_한쪽
_한편
_할
; _합
; _항
*핵
; _행
;_향후
_허
_혁
; _현
; _호
; _홉
; _홍
; _홑
; _화
_확
_환
; _황
; _홰
; _획
; _횡
_후
; _훅
_휘
; _흑
_힐
*힘
;
;=======================[ 불용어, 특수색인어 사전 끝 ]====================
;


:

영문 stopwords

Elastic/Elasticsearch 2013. 1. 22. 11:14

형태소분석기 소스 분석을 위해서 필요한 정보를 하나씩 모아 봐야 할 것 같내요.
우선은 stopwords 부터.. 모아 봅니다.

[English Stopword1]

a
about
above
after
again
against
all
am
an
and
any
are
aren't
as
at
be
because
been
before
being
below
between
both
but
by
can't
cannot
could
couldn't
did
didn't
do
does
doesn't
doing
don't
down
during
each
few
for
from
further
had
hadn't
has
hasn't
have
haven't
having
he
he'd
he'll
he's
her
here
here's
hers
herself
him
himself
his
how
how's
i
i'd
i'll
i'm
i've
if
in
into
is
isn't
it
it's
its
itself
let's
me
more
most
mustn't
my
myself
no
nor
not
of
off
on
once
only
or
other
ought
our
ours 
ourselves
out
over
own
same
shan't
she
she'd
she'll
she's
should
shouldn't
so
some
such
than
that
that's
the
their
theirs
them
themselves
then
there
there's
these
they
they'd
they'll
they're
they've
this
those
through
to
too
under
until
up
very
was
wasn't
we
we'd
we'll
we're
we've
were
weren't
what
what's
when
when's
where
where's
which
while
who
who's
whom
why
why's
with
won't
would
wouldn't
you
you'd
you'll
you're
you've
your
yours
yourself
yourselves


[English Stopword2]

a

a's

able

about

above

according

accordingly

across

actually

after

afterwards

again

against

ain't

all

allow

allows

almost

alone

along

already

also

although

always

am

among

amongst

an

and

another

any

anybody

anyhow

anyone

anything

anyway

anyways

anywhere

apart

appear

appreciate

appropriate

are

aren't

around

as

aside

ask

asking

associated

at

available

away

awfully

b

be

became

because

become

becomes

becoming

been

before

beforehand

behind

being

believe

below

beside

besides

best

better

between

beyond

both

brief

but

by

c

c'mon

c's

came

can

can't

cannot

cant

cause

causes

certain

certainly

changes

clearly

co

com

come

comes

concerning

consequently

consider

considering

contain

containing

contains

corresponding

could

couldn't

course

currently

d

definitely

described

despite

did

didn't

different

do

does

doesn't

doing

don't

done

down

downwards

during

e

each

edu

eg

eight

either

else

elsewhere

enough

entirely

especially

et

etc

even

ever

every

everybody

everyone

everything

everywhere

ex

exactly

example

except

f

far

few

fifth

first

five

followed

following

follows

for

former

formerly

forth

four

from

further

furthermore

g

get

gets

getting

given

gives

go

goes

going

gone

got

gotten

greetings

h

had

hadn't

happens

hardly

has

hasn't

have

haven't

having

he

he's

hello

help

hence

her

here

here's

hereafter

hereby

herein

hereupon

hers

herself

hi

him

himself

his

hither

hopefully

how

howbeit

however

i

i'd

i'll

i'm

i've

ie

if

ignored

immediate

in

inasmuch

inc

indeed

indicate

indicated

indicates

inner

insofar

instead

into

inward

is

isn't

it

it'd

it'll

it's

its

itself

j

just

k

keep

keeps

kept

know

knows

known

l

last

lately

later

latter

latterly

least

less

lest

let

let's

like

liked

likely

little

look

looking

looks

ltd

m

mainly

many

may

maybe

me

mean

meanwhile

merely

might

more

moreover

most

mostly

much

must

my

myself

n

name

namely

nd

near

nearly

necessary

need

needs

neither

never

nevertheless

new

next

nine

no

nobody

non

none

noone

nor

normally

not

nothing

novel

now

nowhere

o

obviously

of

off

often

oh

ok

okay

old

on

once

one

ones

only

onto

or

other

others

otherwise

ought

our

ours

ourselves

out

outside

over

overall

own

p

particular

particularly

per

perhaps

placed

please

plus

possible

presumably

probably

provides

q

que

quite

qv

r

rather

rd

re

really

reasonably

regarding

regardless

regards

relatively

respectively

right

s

said

same

saw

say

saying

says

second

secondly

see

seeing

seem

seemed

seeming

seems

seen

self

selves

sensible

sent

serious

seriously

seven

several

shall

she

should

shouldn't

since

six

so

some

somebody

somehow

someone

something

sometime

sometimes

somewhat

somewhere

soon

sorry

specified

specify

specifying

still

sub

such

sup

sure

t

t's

take

taken

tell

tends

th

than

thank

thanks

thanx

that

that's

thats

the

their

theirs

them

themselves

then

thence

there

there's

thereafter

thereby

therefore

therein

theres

thereupon

these

they

they'd

they'll

they're

they've

think

third

this

thorough

thoroughly

those

though

three

through

throughout

thru

thus

to

together

too

took

toward

towards

tried

tries

truly

try

trying

twice

two

u

un

under

unfortunately

unless

unlikely

until

unto

up

upon

us

use

used

useful

uses

using

usually

uucp

v

value

various

very

via

viz

vs

w

want

wants

was

wasn't

way

we

we'd

we'll

we're

we've

welcome

well

went

were

weren't

what

what's

whatever

when

whence

whenever

where

where's

whereafter

whereas

whereby

wherein

whereupon

wherever

whether

which

while

whither

who

who's

whoever

whole

whom

whose

why

will

willing

wish

with

within

without

won't

wonder

would

would

wouldn't

x

y

yes

yet

you

you'd

you'll

you're

you've

your

yours

yourself

yourselves

z

zero


:

Elasticsearch search load balancer 구성.

Elastic/Elasticsearch 2013. 1. 18. 12:30

그냥 쉽게 가려고 고민하지 않고 L4 신청했는데 오판 이였습니다.
elasticsearch 에서 L4 에서 보내는 syn signal 에 rst 을 던지고 있습니다.
그렇다 보니 binding 이 정상적으로 되지 않고 VIP 로 접속 시 접속이 되지 않는 문제가 있는데요.
요건 검색해 보시면 명쾌한 답이 나옵니다.
ES 를 직접 개발한 사람이 그러더군요.

"There is no need load balancer in elasticsearch."

이유 인 즉,
Java API 를 사용하면 Perfect!! 라고 합니다.

저도 살짝 놓친 부분인데요. (알고 있어도 고민하지 않으면.. 이렇다니까요 ㅡ.ㅡ;;)

client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(host, port));

여기서 search 용 node 를 추가해 주면 됩니다.
어떻게???
이렇게요.. 

client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(host1, port))
.addTransportAddress(new InetSocketTransportAddress(host2, port));

혹시라도 L4 랑 붙혀서 사용하려고 고민하시는 분들을 위해서 그냥 올려 봅니다. ;;

:

elasticsearch 색인 생성 스크립트 예제

Elastic/Elasticsearch 2013. 1. 16. 14:54

그냥 예제 입니다. ㅎㅎ

생성 시 적용된 내용은
- replica 설정
- shards 설정
- refresh interval 설정
- term index interval 설정
- field store 시 compression 설정
- analyzer 설정
- synonym 설정
- routing 설정
- _all disable(?) 설정

# index 삭제

curl -XDELETE 'http://localhost:9200/index0/'


# index 생성

curl -XPUT 'http://localhost:9200/index0' -d '{

    "settings" : {

        "number_of_shards" : 50,

        "number_of_replicas" : 1,

        "index" : {

            "refresh_interval" : "60s",

            "term_index_interval" : "1",

            "store" : {

                "compress" : {

                    "stored" : true,

                    "tv" : true

                }

            },

            "analysis" : {

                "analyzer" : {

                    "kr_analyzer" : {

                        "type" : "custom",

                        "tokenizer" : "kr_tokenizer",

                        "filter" : ["trim", "kr_filter", "kr_synonym"]

                    },

                    "kr_analyzer" : {

                        "type" : "custom",

                        "tokenizer" : "kr_tokenizer",

                        "filter" : ["trim", "kr_filter", "kr_synonym"]

                    }

                },

                "filter" : {

                    "kr_synonym" : {

                        "type" : "synonym",

                        "synonyms_path" : "analysis/synonym.txt"

                    }

                }

            }

        },

        "routing" : {

            "required" : true,

            "path" : "indexType.user_uniq_id"

        }

    },

    "mappings" : {

        "indexType" : {

            "properties" : {

                "docid" : { "type" : "string", "store" : "yes", "index" : "not_analyzed", "include_in_all" : false },

                "rm_seq" : { "type" : "long", "store" : "yes", "index" : "no", "include_in_all" : false },

                "rm_join_seq" : { "type" : "long", "store" : "yes", "index" : "no", "include_in_all" : false },

                "rm_title" : { "type" : "string", "store" : "yes", "index" : "analyzed", "term_vector" : "yes", "analyzer" : "kr_analyzer", "include_in_all" : false },

                "user_uniq_id" : { "type" : "string", "store" : "yes", "index" : "not_analyzed", "include_in_all" : false },

                "mb_nm" : { "type" : "string", "store" : "yes", "index" : "analyzed", "term_vector" : "yes", "analyzer" : "kr_analyzer", "include_in_all" : false },

                "mb_count" : { "type" : "integer", "store" : "yes", "index" : "no", "include_in_all" : false },

                "rm_ymdt" : { "type" : "date", "format" : "yyyyMMddHHmmss", "store" : "yes", "index" : "not_analyzed", "include_in_all" : false },

                "data_size" : { "type" : "long", "store" : "yes", "index" : "no", "include_in_all" : false },

                "msgs" : {

                    "properties" : {

                        "msg_seq" : { "type" : "long", "store" : "no", "index" : "no", "include_in_all" : false },

                        "msg" : { "type" : "string", "store" : "yes", "index" : "analyzed", "term_vector" : "yes", "analyzer" : "kr_analyzer", "include_in_all" : false },

                        "send_user_uniq_id" : { "type" : "string", "store" : "yes", "index" : "not_analyzed", "include_in_all" : false },

                        "send_user_nick_nm" : { "type" : "string", "store" : "yes", "index" : "not_analyzed", "term_vector" : "yes", "analyzer" : "kr_analyzer", "include_in_all" : false },

                        "recv_ymdt" : { "type" : "date", "format" : "yyyyMMddHHmmss", "store" : "yes", "index" : "not_analyzed", "include_in_all" : false },

                        "cfn_yn" : { "type" : "string", "store" : "no", "index" : "no", "include_in_all" : false },

                        "send_yn" : { "type" : "string", "store" : "yes", "index" : "not_analyzed", "include_in_all" : false },

                        "msg_type" : { "type" : "integer", "store" : "yes", "index" : "not_analyzed", "include_in_all" : false }

                    }

                }

            }

        }

    }

}'


:

Using Elasticsearch for logs - 활용 팁.

Elastic/Elasticsearch 2013. 1. 16. 13:20

원문 : http://www.elasticsearch.org/tutorials/2012/05/19/elasticsearch-for-logging.html
번역 : http://socurites.com/122

http://www.elasticsearch.org/guide/reference/api/admin-indices-templates.html

http://www.elasticsearch.org/guide/reference/mapping/source-field.html

http://www.elasticsearch.org/guide/reference/mapping/all-field.html

http://www.elasticsearch.org/guide/reference/query-dsl/

http://www.elasticsearch.org/guide/reference/api/bulk.html


아무래도 이상해서 더 찾아 봤습니다. ㅋㅋ
http://www.elasticsearch.org/guide/reference/index-modules/store.html
이 문서를 보면 일단 _all 과 _source 는 reserved keyword 같구요. (소스 보기 귀찮아서 상상만.. )
문서 보고 store 옵션을 줘서 처리 했습니다.
결과는 ㅎㅎ 성공 ^^

"settings" : {
    "number_of_shards" : 50,
    "number_of_replicas" : 1,
    "index" : {
        "refresh_interval" : "1s",
        "term_index_interval" : "1",
        "store" : {
            "compress" : {
                "stored" : true,
                "tv" : true
            }
        }
    },

    "mappings" : {
        "type명" : {
            "properties" : {               
                "docid" : { "type" : "string", "store" : "yes", "index" : "not_analyzed", "include_in_all" : false },
                "seq" : { "type" : "long", "store" : "yes", "index" : "no", "include_in_all" : false }
            }
        }
    }
}

그리고 _all 에 대해서는 보시는 것 처럼 include_in_all : false 를 해서 _all 로는 어떤것도 매칭이 되지 않습니다.
이건 젤 위 문서에서 all-field.html 보시면 되겠습니다.
참고하시라고 압축율은 무려 80% 나 되내요.. ㅎㅎ


위 링크들 보고 열심히 튜닝 중이긴 한데.. 이게 효과가 있는건지 없는건지 알수가 없내요.. ㅡ.ㅡ;;
(_all, all, _source, source 이건 setting 할때 둘다 적용 되더라구요.)

"all" : {
            "enabled" : false
        },

"source" : {
            "enabled" : true,
        }

용도에 따라 disk 용량을 효율적으로 사용하기 위해서 위와 같은 구성을 했는데.. 흠.. 일단 용량은 조금 줄었는데.. 좀 큰 사이즈로 한번 돌려봐야 겠내요.

데이터 건수가 적은 걸로 돌렸을 때 옵션 안주고 돌리면
- 447MB

옵션주고 돌리면
- 438MB

9MB 절약 되었습니다. ^^;

:

elasticsearch + 한국어 형태소 분석기 색인 시 운영 경험 공유.

Elastic/Elasticsearch 2013. 1. 15. 23:48

역쉬 쉬운게 없군요.. 
드뎌 elasticsearch 랑 kr analyzer 랑 문제를 해결했습니다.

제가 es 의 clustering 구성을 master node 를 두개로 구성했습니다.
그리고 색인 시 20개의 thread 를 생성해서 색인 데이터를 request 했구요.
물론 master node 한대를 target 으로 하고 request 했지요.

근데 es 내부에서 자동으로 master 끼리 분산 처리를 하더군요.

첨에는 소스 보기 귀찮아서 환경이랑 설정만 가지고 삽질을 했는데.. 도저희 해결이 안되서 소스를 직접 수정해서 디버깅을 하기 시작 했습니다.

짜잔.. ^^
해결책은 비교적 쉬운 곳에 있었습니다.

master node 를 하나만 사용하거나 thread safe 하도록 kr analyzer 소스를 조금 손봐주는 것입니다.

결론만 보면 정말 쉬운데요.. ㅋ 그 과정이 참 오래 걸렸내요.. 
그래도 뭐 빨리 찾았다고 생각 합니다.. ㅎㅎ

이상 es 운영 경험 공유를 맞칩니다. ^^


[해결방법1] <- 이건 근본해결책도 아니고 그냥 쓰레기 입니다. 그리고 data node 설정도 틀렸내요. 
- 서버 1 : node.master: true, node.data: true
- 서버 2 : 
node.master: false, node.data: true
아마도 
- 서버 1 : node.master: true, node.data: false
- 서버 2 : 
node.master: false, node.data: true
-> 다른 분이 테스트 해보시고 안된다고 그러시내요 ^^;


[해결방법2]

- SyllableUtil.java 에서 getSyllableFeature() 이 함수 내 FileUtil.readlines 를 threadsafe 하게 수정
- 저는 synchronized(lock) 으로 처리 했습니다.

:

Elasticsearch + 한국어형태소분석기 + JDK 호환 문제.

Elastic/Elasticsearch 2013. 1. 14. 11:02

아래 내용이 잘못 되어서 정정 합니다. ㅡ.ㅡ;;
kr_filter 부분에서 오류가 발생을 하는 것은 맞습니다.
다만, 해결책이 현재 클리어 하지 않은 상황이라 일단 적용한 스키마 코드랑 문제에 대한 차선책을 공유 합니다.
kr_filter 를 ngram 으로 변경했으나 이것도 최선은 아닙니다.

[문제가 된 스키마]

        "index" : {

            "analysis" : {

                "analyzer" : {

                    "kr_analyzer" : {

                        "type" : "custom",

                        "tokenizer" : "kr_tokenizer",

                        "filter" : ["trim", "kr_filter", "kr_synonym"]

                    },

                    "kr_analyzer" : {

                        "type" : "custom",

                        "tokenizer" : "kr_tokenizer",

                        "filter" : ["trim", "kr_filter", "kr_synonym"]

                    }

                },

                "filter" : {

                    "kr_synonym" : {

                        "type" : "synonym",

                        "synonyms_path" : "analysis/synonym.txt"

                    }

                }

            }

        }

[차선책]

        "index" : {

            "analysis" : {

                "analyzer" : {

                    "kr_analyzer" : {

                        "type" : "custom",

                        "tokenizer" : "kr_tokenizer",

                        "filter" : ["trim", "ngram", "kr_synonym"]

                    },

                    "kr_analyzer" : {

                        "type" : "custom",

                        "tokenizer" : "kr_tokenizer",

                        "filter" : ["trim", "ngram", "kr_synonym"]

                    }

                },

                "filter" : {

                    "kr_synonym" : {

                        "type" : "synonym",

                        "synonyms_path" : "analysis/synonym.txt"

                    },

                    "ngram" : {

                        "type" : "ngram",

                        "min_gram" : 2,

                        "max_gram" : 8

                    }

                }

            }

        }



운영을 하면서 발생한 이슈를 공유 합니다.

elasticsearch 0.19.12 + elasticsearch-analysis-korean-1.1.0 + jdk1.6.0 32
▷ 이 구성에서 JDK 버전으로 인해 분석기에서 오류가 발생 합니다.
▷ 오류 내용은 analysis 세팅 시 filter 부분에 trim 과 kr_filter 적용을 해야 합니다.
▷ 근데 이 두 filter 에서 색인 시 오류가 납니다.
▷ 해결책은 일단 개발 환경과 동일하게 JDK 버전을 낮춰서 해결을 했습니다.

사용 시 참고하세요.


그리고 elasticsearch-analysis-korean 이넘은 elasticsearch 0.19.9 로 빌드 되어 있어서 0.2x 버전이랑 함께 사용할 경우 오류가 납니다.
참고하세요.

:

elasticsearch query uri 예제들.

Elastic/Elasticsearch 2013. 1. 9. 12:02

기본적으로 /_plugin/head 에서 structured query 를 만들수 있지만 좀 더 다양한 옵션을 주고 싶을 경우 추가 구성을 해야 합니다.
elasticsearch.org 문서만 가지고 만들다 보면 처음 접하시는 분들은 어떻게 시작할지 막막할 수 있죠.
그래서 제가 테스트 했던 것들 올려 봅니다.


[기본쿼리]
http://localhost:9200/jjeong0/_search?q=msg:채팅&pretty=true
- msg 라는 field 에 대해서 검색 수행

http://localhost:9200/jjeong0/_search?q=msg:안녕 OR title:안녕하세요&sort=cre_ymdt:desc&from=0&size=10&pretty=true
- msg 와 title field 에 대해서 OR 검색을 수행


[JSON String Type]
[Paging+term 기반 쿼리]

http://localhost:9200/jjeong0/_search?source={"from":0,"size":10,"query":{"term":{"msg":"안녕하세요"}}}&pretty=true
- msg 라는 field 에 대해서 term 기반으로 검색 수행
- from 은 시작 offset 값이며, size 는 한 번에 fetch 해올 문서 크기

[Sorting + term 기반 쿼리]
http://localhost:9200/jjeong0/_search?source={"query":{"bool":{"must":[{"term":{"msg":"안녕"}}],"must_not":[],"should":[]}},"from":0,"size":50,"sort":[{"cre_ymdt":"asc"}],"facets":{}}&pretty=true
- msg 에 반드시 "안녕" 이라는 단어가 포함이 된 것만 검색
- cre_ymdt 값에 대한 ascending sorting
- http://www.elasticsearch.org/guide/reference/api/search/sort.html

[Range Search]
http://localhost:9200/jjeong0/_search?source={"query":{"range":{"recv_ymdt":{"from":"20120820163946", "to":"20120911160444"}}}}&pretty=true
- recv_ymdt 라는 값에 대해서 범위를 지정하고 검색
- http://www.elasticsearch.org/guide/reference/query-dsl/range-query.html

[Query String Search]
http://localhost:9200/jjeong0/_search?source={"query":{"bool":{"must":[{"query_string":{"default_field":"msg","query":"%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"}}],"must_not":[],"should":[]}},"from":0,"size":50,"sort":[{"cre_ymdt":"desc"}],"facets":{}}&pretty=true
- http://www.elasticsearch.org/guide/reference/query-dsl/query-string-query.html

[Highlight Search]
http://localhost:9200/jjeong0/_search?source={"query":{"bool":{"must":[{"query_string":{"default_field":"msg","query":"안녕 하세요"}}],"must_not":[],"should":[]}},"from":0,"size":50,"sort":[{"cre_ymdt":"desc"}],"facets":{},"highlight":{"pre_tags":["<b>"],"post_tags":["</b>"],"fields":{"msg":{}}}}&pretty=true
- http://www.elasticsearch.org/guide/reference/api/search/highlighting.html

[Term+QueryString+Range+Highlight, Sort, Paging, Routing]
http://localhost:9200/jjeong0/_search?source={"from":0,"size":20,"query":{"bool":{"must":[{"term":{"user_uniq_id":"jjeong.tistory.com"}},{"query_string" : {"default_operator" : "OR","fields" : ["msg", "title"],"query" : "안먹어"}},{"range":{"rm_ymdt":{"from":"20121209000000","to":"20130110000000","include_lower":true,"include_upper":true}}}]}},"highlight":{"pre_tags":["<b>"],"post_tags":["</b>"],"fields":{"msg":{},"title":{}}},"sort":[{"cre_ymdt":{"order":"desc"}}]}&routing=jjeong.tistory.com&pretty=true
- http://www.elasticsearch.org/guide/reference/mapping/routing-field.html


: