google reader에서 소식을 접하고 homepage에 가 봤는데, 오늘 공개되었군요.
거의 6개월만의 새 버젼이군요~

어떤 기능들이 추가되었는지, 어떤 버그들이 수정되었는지 살펴볼까 했는데... 내용이 넘 많네요.
버젼이 올라간 정도를 봐서도 대략 짐작이 되지요~

3.0버젼업을 앞둔 API 하위 호환성 얘기부터, runtime 변경, api 변경, 새 기능, bugfix... 많군요.
그 중 중요 내용을 정리한 Lucene News에 나온 내용들 중에서도 개인적으로 관심을 갖게된 부분은 

Near real-time search capabilities added to IndexWriter

너무 늦었으니, 오전에 좀 더 꼼꼼히 보고 추가할까 합니다.
그럼 이만

쩝... 계속 발전하는 루씬의 모습을 보면 기분은 좋긴한데...
2.0으로 만들었던 걸 2.3으로 다시 만들어서 런칭한 날 2.4가 나오다니 --;;

게다가 2.4에는 바뀐것도 많다.
심지어 changelog 형식도 바뀌었군요 ㅋㅋ


역시나 별로 관심 없지만 뭐가 바뀌었는지 궁금하긴 한 사람들을 위해 중요 point만 정리해볼까 합니다.

가장 큰 변화
Lucene 2.4.0 includes index format changes that are not readable by older versions of Lucene. Lucene 2.4.0 can both read and update older Lucene indexes. Adding to an index with an older format will cause it to be converted to the newer format.
index format을 또(과거 2.1.0에서 한번 변경 되었다.) 변경하셨다. 그래서 이전 버젼으로 만든 lucene서버에서는 새 index format을 읽을 수 없다. 당연하지만 새 버젼으로 만든 lucene으로는 기존 버젼의 index를 읽을 수 있지만... 

기타 변화들 중 중요한 변화를 change log에서 뽑아볼까 했으나 이미 여기에 정리가 다 되어 있는 것 같아서 그냥 한글로만 정리해 볼까 합니다.

- "InstantiatedIndex"라는 class가 생겼는데, 기존의 RAMDirectory보다 훨씬 빠르다고 한다. 테스트 해 봐야겠네요.

- IndexWrite가 indexing 중에 OS의 문제나 갑자가 power가 꺼져도 index가 깨지지 않는다고 한다. 이건 맘에 들지만.. 여지껏 index가 깨지는 걸 경험하질 못해서... --;;

LUCENE-997 : 검색 시 시간 제약을 둘 수 있게 되었다. 특정 시간이 넘어가지 않도록... 해당 시간이 넘어가면 "TimeExceeded Exception"를 발생시킨다고 한다. 이걸 외부에서 wrapping해서 처리한다고 삽질했던 기억이....

- NIOFSDirectory : to allow multiple threads to read from the same open file without locking. 이걸 쓰면 퍼포먼스가 좀 향상될라나??

- "now the filter is applied to a document before scoring is done" : 예전엔 filter로 거르기 전에 scoring을 다 했었나보네요 --;; filter 쿼리가 많이 빨라지지 않았을까요? 아이고 궁금해라...

- "IndexReader can be opened with new readOnly=true mode" : IndexReader를 readOnly모드로 열면 multithread환경에서 보다 나은 성능을 기대할 수 있다는데... 그럼 IndexSearcher를 그냥 만들면 알아서 readonly 모드로 열릴라나... 이것도 테스트 해봐야겠네요~
소스 받아서 확인해 봤는데... IndexSearcher를 생성하면 내부적으로 알아서 IndexerReader를 readonly로 생성하는군요. 
public IndexSearcher(String path) throws CorruptIndexException, IOException {
        this(IndexReader.open(path), true);
}


위에 나열한 변화 외의 변화들도... 평소의 변화들에 비해는 조금 큰 변화이니 처음 접하는 분들이야 그냥 쓰면 되겠지만 예전부터 사용하는 분들은 꼼꼼히 살펴보는 게 좋을 것 같네요~

그럼.. 게으른 포스팅 여기서 마물...

'programming > Java' 카테고리의 다른 글

lucene 2.9.0 available!! 루씬 새버젼 출시~  (0) 2009.09.29
lucene의 Release 2.2.0 2007-06-19 을 보다가...  (0) 2008.04.10
lucene 2.1.0 released  (1) 2007.02.21
현재 lucene 2.0.0을 쓰고 있는데, 2008년 2월 22일에 나온 2.3.1 버젼을 적용할 필요가 있는지를 살펴보다가, 예전에 블로깅한 lucene내부의 query를 escape하는 함수에 버그가 고쳐진 것을 발견했다.

이상하게도 &와 |에 대해서 escape이 빠져있다 생각했는데.. 버그였다니 --;;

17. LUCENE-881: QueryParser.escape() now also escapes the characters
'|' and '&' which are part of the queryparser syntax. (Michael Busch)

lucene의 버젼 별 변경 내역

'programming > Java' 카테고리의 다른 글

루씬 upgrade 되다!! (Lucene Java 2.4.0 available)  (4) 2008.10.31
lucene 2.1.0 released  (1) 2007.02.21
Java에서 XML관련 예외  (2) 2007.01.30
오늘 lucene 홈페이지 들어갔다가 알게됐다. 2월 14일에 새 release가 발표됐다.

lucene으로 프로그래밍 한 지 좀 지나서 또 가물가물 해졌지만... 그래도 관심이 있어 좀 읽어 봤는데, 몇 가지 내용만 정리해 봤다.

Changes
* 's'와 't'가 StopAnalyzer(StandardAnalyzer에서도 사용됨)의 stopword에서 제거됨.
* StandardAnalyzer의 CJK에 대한 unicode code point ranges가 update됐다.(CJ와 K로 분리됨)
* WildcardQuery의 queryString에 ? 나 *가 포함되어 있지 않으면 알아서 TermQuery를 수행한다. 이전 버젼의 경우에는 StringIndexOutOfBoundsException이 발생했었다
* deprecated되었던 doc.fields() 와 Enumeration을 제거
* write lock 파일이 Index directory에 생성됨. 이전에는 "org.apache.lucene.lockDir" or "java.io.tmpdir"였음.
 - 첨엔 write lock이 어디 있는지 몰라 헤맸었는데, 찾기 쉬워진 듯

New Feature
* ThaiAnalyzer와 ThaiWordFilter가 추가됨
 - 태국어쪽 작업하는 사람은 별로 없겠지만... 요즘 게임업체는 태국에 많이 진출했으니, 그 업체들에서 CS 툴의 검색 기능을 lucene으로 붙일 수 있을 듯 ^^''
* NGramTokenizer와 EdgeNGramTokenizer class 추가됐고, unit test를 통과
 - cjk analyzer는 특정 unicode 범위에 대해서는 2-gram 방식인걸로 알고 있는데, NGram을 응용하면 보다 나은 검색 시스템을 만들 수 있을까???
* IndexWriter에 document를 update(내부적으로는 delete then add)할 수 있는 method추가
 - 귀찮게 delete했다가 add할 것 없이 바로 update할 수 있으니 조금 편할 듯

더 자세한 내용은 아래에서...

출처 : http://svn.apache.org/repos/asf/lucene/java/tags/lucene_2_1_0/CHANGES.txt

Lucene 검색을 할 때,

특정 조건을 AND로 추가해서 Query할 수도 있고,
특정 조건을 Filter로 추가해서 Query할 수도 있다.

총 검색되는 갯수는 같지만, 간단하지만 보이지 않는 차이를 정리해 보면...
* AND로 검색을 하면 score에 해당 내용이 반영이 되어 정확도로 정렬할 경우 해당 내용이 반영된다.
* AND로 검색을 하면 별로도 추가로 검색을 하는 것이므로, 부하가 있는 쿼리의 경우는 AND조건 검색보다 Filter로 걸러내는 것이 속도가 빠르다. (검색된 것들 중에서 filtering을 하는 것이니 당연히 빠르겠죠? 전체 인덱스의 크기가 크면 클 수록 and query를 이용한 것 보다 훨씬 빠를테니까요.)

조금 더 자세히 몇 가지를 설명하자면...
Lucene in Action과 현재 licene 2.0 버젼이 filter 부분이 차이가 좀 있는데
DateFilter라는건 없어졌다.

그리고 내 경우는 기존에 사용하던 Filter도 있어서...
추가로 한가지 Filter를 추가한 case라서..

ChainedFilter에 두가지 filter를 추가해서 생성해서 사용했다.
참고 : http://lucene.apache.org/java/docs/api/index.html

Lucene에서는 numeric 범위 연산을 제공하지 않아, 숫자에 대해 범위 연산을 할 경우, 사용하는 자리수 많은 부족한 부분에 0을 채워줘야 한다.

간단하게 예를 들어 0~999까지의 숫자를 range검색하려면... 인덱싱할 때
1 -> 001
42 -> 042
999 -> 999

이렇게 인덱싱을 하고 검색할 때도 "032 TO 311" 이렇게 검색해 줘야만 제대로 검색이 가능하다.
그러므로 속도가 많이 느리다.

아래 출처에 보면, 음수를 포함하는 범위 검색을 하는 방법도 나와 있으니 필요한 분은 참고 하시길...

출처 : http://wiki.apache.org/jakarta-lucene/SearchNumericalFields

출처의 내용은 첨부 파일로 올려 놓는다.


SearchNumericalFields - Jakarta-lucene Wiki.mht



검색 결과에서 검색어를 highlight 시키는 기능을 구현하는데, lucene의 sandbox의 Highlighter를 이용해 봤다.


샘플 소스와 동일하게하고 analyzer만 CJKAnalyzer로 변경했는데... 결과는

"학교에서 우리 선생님께서 나에게 좋은 대학교를 골라 주셨다."에서 "학교"를 검색했다고 가정하면

변환한 결과는 아래와 같이 나온다.
"<B>학교에서</B> 우리 선생님께서 나에게 좋은 <B>대학교를</B> 골라 주셨다"

검색한 단어만이 아닌 조사까지 포함해서 처리가 된다.
혹시 단어만 하일라이팅 시키는 방법을 알고 계신분 있으신가요???


lucene을 이용해 검색을 구현할 때, 검색어에 lucene에서 사용하는 특수기호를 넣으면, 잘못 반영 될 소지가 있어, lucene에서 사용하는 특수 기호들에 대해서는 escape(기호 앞에 \를 추가)을 해 줘야 한다.

정규식을 이용해 간단하게 구현했는데, Lucene in Action 책을 보니 sandbox에 있는 js를 참고하라고 해서 홈페이지에 가 보니 없었다.

결국 알고보니 api에 추가가 되었다.
QueryParse.escape();

나 처럼 뻘짓하는 분 없기를...  

but....

http://lucene.apache.org/java/docs/queryparsersyntax.html
여기 가 보면 lucene에서 사용하는 특수기호들에 대한 설명이 나와 있다.
'+ - && || ! ( ) { } [ ] ^ " ~ * ? : \'

그런데 lucene의 escape 코드를 보면 '&&'와 '||'은 빠져 있다.
(2007년 6월 19일 발표된 2.2.0버젼에서 bugfix 되었습니다.)

직관적으로 이해 하겠지만 search value에  &&는 and로 ||는 or로 변환되어 처리되므로,
실제  &&나 ||를 검색해야 하는 경우 코드를 따다 수정해서 사용해야 할 듯.



실제 lucene 코드

+ Recent posts