Top

(개정판) 루씬 인 액션 [고성능 오픈소스 자바 검색엔진]

  • 원서명Lucene in Action, Second Edition: Covers Apache Lucene 3.0 (ISBN 9781933988177)
  • 지은이마이클 맥캔들리스, 에릭 해쳐, 오티스 고스포드네티치
  • 옮긴이강철구
  • ISBN : 9788960774674
  • 45,000원
  • 2013년 08월 30일 펴냄
  • 페이퍼백 | 776쪽 | 188*250mm
  • 시리즈 : 오픈소스 프로그래밍

책 소개

DB에 담겨 있는 수백만 건의 정보를 마음대로 조회하지 못하거나, 사내 인트라넷의 엄청난 디렉토리 구조 안에 저장된 수많은 문서 중 원하는 내용이 들어있는 문서를 찾지 못해 어려움을 겪고 있다면, 그렇다고 상용 검색 엔진을 구입해 사용하기엔 너무 부담스러운 경우, 루씬(Lucene)이 정답이다. 이 책은 외주 개발이든 사내 개발이든 간에 전문적인 검색 기능을 필요로 한다면 최우선으로 고려해야 할 루씬에 대해 색인부터 검색과 고급 설정까지 예제 기반으로 설명한다. 『(개정판) 루씬 인 액션』을 기반으로 루씬의 A부터 Z까지 완벽하게 활용하는 고성능 검색 애플리케이션을 개발해보자.


[ 개정판에서 추가된 내용 ]

초판이 출간된 이후 5년간 루씬 프로젝트에서 많은 부분이 달라졌다. 영향력 있는 오픈소스 프로젝트는 대부분 그렇지만 루씬도 탄탄한 기술적인 기반을 갖고 있으며, 사용자와 개발자가 참여하는 안정적인 커뮤니티가 계속해서 유지되고 있고, 이런 잠재력이 뭉쳐 엄청나게 발전하는 중이다. 초판이 출간된 이후 추가되거나 변경된 기능을 살펴보면 대략 다음과 같다.

■ 준실시간 검색
■ 문서에서 텍스트를 추출할 때 티카(Tika) 프로젝트 활용
■ NumericField를 통해 숫자 필드를 만들고, NumericRangeQuery 질의로 숫자 범위를 빠르게 조회 가능
■ IndexWriter를 통해 문서를 변경하거나 삭제
■ IndexWriter에서 트랜잭션 관련 기능 제공(커밋이나 롤백)
■ 읽기 전용의 IndexReader와 NIOFSDirectory 등을 활용해 병렬 검색 능력 개선
■ 순수한 불리언 검색 기능
■ 색인에 추가 정보를 적재하고, BoostingTermQuery 등에서 적재된 정보를 활용
■ IndexReader.reopen 메소드로 변경 사항이 반영된 IndexReader 인스턴스를 최대한 효율적으로 확보 가능
■ 메모리, 디스크, 파일 기술자 등의 자원 활용도 파악
■ 함수 질의
■ 색인이나 검색 속도 등의 성능 지표를 기준으로 최적화
■ 진행 중인 색인 작업을 멈추지 않고도 색인의 내용을 백업
■ 추가 언어에 대한 루씬 포팅 프로젝트
■ 성능 측정 프레임워크를 사용한 루씬의 성능 측정
■ 재사용할 수 있는 TokenStream API
■ 색인이나 검색할 때 스레드를 활용해 병렬 처리
■ 색인에 저장된 필드의 내용을 가져올 때 FieldSelector를 활용해 성능 개선
■ TermVectorMapper를 사용해 텀 벡터를 불러오는 방법 제어
■ 루씬의 락 관리 정책 단순화
■ LockFactory, DeletionPolicy, IndexDeletionPolicy, MergePolicy, MergeScheduler 등을 입맛에 맞게 새로 구현
■ XMLQueryParser나 루씬 지역 검색 등의 새로운 contrib 모듈
■ 자주 발생하는 문제 수정

그리고 12장, 13장, 14장에 새로운 사례 연구도 실었다. 루씬의 관리 측면을 설명하고자 11장도 추가했다. 원래 여러 종류의 문서를 읽고 파싱하는 프레임워크에 대해 설명했던 7장에서는 아파치 프레임워크 중 하나인 티카를 기반으로 새로 설명한다. 그리고 모든 예제 코드는 3.0.1 버전을 기준으로 작성했다. 물론 초판에서 받았던 독자의 다양한 의견도 다수 반영했다.


[ 이 책의 대상 독자 ]

자신들의 제품이나 솔루션에 강력한 검색 기능을 더하려는 개발자들은 이 책을 꼭 읽어야 한다. 또한 단순히 루씬이 어떤 것인지 궁금한 사람에게도 훌륭한 정보를 제공하며, 정보 검색 기술에 대해 공부하는 독자에게도 좋은 교재가 될 수 있다. 그리고 당장은 알아둘 필요가 없다 하더라도 읽어두면 정보 검색이라는 트렌드에 부응하는 지식을 쌓을 수 있다.

이 책에서는 아파치 프로젝트 가운데 하나인 루씬, 즉 자바 버전의 루씬을 중점적으로 다루며, 대부분의 예제 코드도 자바로 작성했다. 따라서 자바에 익숙하다면 아주 편안하게 내용을 이해할 수 있을 것이며, 여러 가지 자바 프로그래밍 경험은 이 책을 읽는 데 큰 도움이 된다. 자바 버전의 루씬이 아니고 C++나 C#, 파이썬, 펄 등의 언어로 루씬을 사용해도 기본개념과 주요기능은 자바 버전과 거의 같으므로 별다른 어려움 없이 적용할 수 있을 것이다.


[ 이 책의 구성 ]

‘1부 루씬 기초'에서는 루씬의 핵심 API와 관련된 내용을 다룬다. 여러분의 프로그램에 루씬을 적용해야 한다면 1부를 꼭 읽어야 한다.

1장은 루씬과의 첫 만남이다. 정보 검색 기술에 대한 약간의 이론적인 내용과 정보 검색에 있어 루씬이 갖는 장점을 소개한다. 그리고 필요에 따라 직접 응용할 수 있게 루씬을 이용해 색인과 검색을 수행하는 간단한 예제 프로그램을 작성한다. 이 예제 프로그램은 이후에 보게 될 모든 예제의 기본이 된다.

2장에서는 루씬의 기본적인 색인 방법에 친숙해질 차례다. 여러 유형의 필드와 숫자와 날짜 등의 자료를 어떻게 색인하는지도 알아보고, 또한 색인 절차를 튜닝하고 최적화하는 방법도 알아본다. 덧붙여 스레드 동기화도 설명한다.

3장은 루씬을 통해 검색하는 방법을 알아본다. 여기서는 질의에 대한 검색 후 결과의 순서, 즉 점수(score)와 순위(ranking)를 결정하는 방법을 포함한다. 그리고 사람이 입력한 질의문을 루씬의 질의로 변환하는 방법과 함께 어떤 종류의 질의어가 가능한지 살펴본다.

4장은 루씬의 색인 작업의 주요 핵심 과정인 분석(analysis)에 대한 내용을 다룬다. 분석의 가장 중요한 단위인 토큰을 비롯해 토큰 스트림, 토큰 필터를 알아보고, 루씬이 기본적으로 제공하는 분석기들과 더불어 동의어 분석기와 유사 발음 분석기에 대해 각각 상세히 다룬다. 그리고 중국어와 같은 비영어권 텍스트에 대한 분석기도 살펴본다.

5장은 검색과 관련해 앞에서 다루지 않았던 내용을 다루며, 텍스트 분석과 관련된 고급 검색 기능, 즉 결과 정렬과 필터링, 텀 벡터(term vector) 가중치를 활용하는 방법을 살펴본다. 또 스팬 질의 계열을 포함한 고급 질의 형태에 대해 알아보고, 루씬의 다중 색인에서 병렬과 원격으로 검색하는 방법을 다룬다.

6장은 이전에 설명했던 고급 검색 기능에 덧붙여 루씬의 검색 기능을 확장하는 방법을 다룬다. 검색 결과를 원하는 대로 정렬할 수 있는 방법, 사용자의 질의문 파싱 부분을 확장하는 방법, 결과를 원하는 대로 수집할 수 있는 방법, 검색 성능을 높이는 몇 가지 방법 등을 배운다.

‘2부 고급 루씬’에서는 루씬의 기본 기능을 기반으로, 루씬을 이용한 실제 작업 등 고급 내용에 대해서 살펴본다.

7장에서는 아파치 루씬 프로젝트 안에 속해 있는 또 다른 오픈소스 프레임워크인 티카(Tika)에 대해 소개한다. 티카를 사용하면 다양한 종류의 문서 파일에서 본문 텍스트와 메타 정보 등을 추출할 수 있다.

8장에서는 루씬과 관련된 다양한 툴을 다룬다. 루씬 소스코드 관리 시스템 안의 contrib 디렉토리 안에 각종 도구가 포함돼 있는데, 루씬의 색인을 살펴볼 수 있는 여러 가지 툴과 개발자가 쓸 수 있는 개발 툴을 소개한다. 먼저 루씬의 색인을 열고 들여다 볼 수 있는 별도의 프로그램인 루크(Luke)에 대해 살펴본다. 그리고 가장 많이 사용하는 루씬 샌드박스 툴로 검색 결과에서 검색어를 눈에 쉽게 띄게 해주는 하이라이터(Highlighter)와 검색어 추천 기능, 비영어권 언어를 처리할 수 있는 분석기, 그리고 여러 종류의 추가적인 질의에 대해 소개한다.

9장에서는 루씬의 contrib 모듈을 통해 지원하는 또 다른 기능을 알아본다. 예를 들어 여러 개의 파일을 연결해 하나인 것처럼 사용하거나, 색인을 버클리 DB에 저장하거나, 워드넷의 유의어를 색인에 반영하는 기능 등이 있다. 그리고 처리 속도를 높이고자 색인 전체를 메모리에 올리는 방법 두 가지를 알아본다. 그 다음으로는 XML의 내용을 읽어 루씬 질의를 생성해주는 XML 질의 파서도 알아본다. 마지막으로 루씬을 사용해 위치 정보를 어떻게 검색하는지 알아보고, 내부 구조가 변경된 QueryParser도 알아본다.

10장에서는 다른 프로그래밍 언어, 예를 들어 C++, C#, 파이썬, 펄, 루비 등의 언어에서 루씬의 기능을 사용하는 방법을 알아본다.

11장에서는 루씬의 관리 측면에 대해 소개한다. 예를 들어 루씬이 디스크와 메모리, 파일 기술자 등의 자원을 얼마나 필요로 하는지 설명한다. 그리고 색인속도나 시간 등의 지표를 측정하는 방법도 알아보고, 색인 작업을 멈추지 않고도 현재 색인을 백업하는 방법, 색인이나 검색 작업에 다중 스레드를 활용해 성능을 최대로 뽑아내는 방법 등도 알아본다.

‘3부 사례 연구’에서는 지금까지 루씬에 대해 설명했던 내용을 기반으로 하면서 루씬을 중점적으로 사용해 흥미롭고 빠르고 대용량 처리가 가능하게 구현한 여러 가지 활용 사례를 소개한다.


[ 이 책 초판에 쏟아진 각계의 찬사 ]

루씬을 애플리케이션에서 활용하려는 사람, 혹은 그냥 루씬이 어떤 기능을 갖고 있는지 궁금한 사람 모두 반드시 읽어봐야 할 책이다.
– 자바로비(JavaLobby)

검색이야말로 정보화 시대를 앞당기는 힘이다. 그리고 『루씬 인 액션』은 정보 검색에 대해 귀중한 정보를 얻을 수 있는 관문이라고 볼 수 있다. 이 책에서는 수많은 예제와 설명을 통해 루씬의 API를 명쾌하게 안내해준다.
- 컴퓨팅 리뷰

루씬에 대해 공부하고 싶거나 애플리케이션에 검색 기능을 추가하려는 사람, 그리고 단순히 정보 검색 분야에 대해 일반적인 지식을 쌓고자 하는 사람 모두 꼭 읽어야 할 책이다. 강력히 추천한다.
- 서버사이드닷컴(TheServerSide.com)

저자가 면밀하게 준비했으며, 편집도 꼼꼼하고, 여러 정보 검색 관련 서적 중 단연 돋보이는 책이다. 정말 재미있게 읽었다. 텍스트에 대한 어떤 종류의 검색 요구 사항이 있건 간에, 이 책을 통해 관련 정보를 충분히 얻을 수 있을 뿐만 아니라 프로젝트도 성공적으로 마칠 수 있겠다. 더군다나 이미 거의 완성된 검색 엔진을 그냥 내려받아 사용하는 경우에도, 이 책을 통해 색인과 검색 등 정보 검색에 대한 일반적이고 원론적인 내용을 습득할 수 있다.
- 슬래시닷(Slashdot.org)

이 책은 종이에 인쇄된 단순한 책이 아니라 보석 같은 존재다. 책을 읽으면서 기존에 갖고 있던 여러 가지 문제를 해결할 수 있었다.
- 아만 앤워(Arman Anwar), Arman@Web

루씬을 사용하고 애플리케이션에 맞게 설정할 때 필요한 내용을 상세하게 안내한다. 가장 유명한 오픈소스 검색 엔진이 어떻게 동작하는지 그 내부 구조를 섬세하게 설명하며, 풍부한 예제 코드를 직접 실행하며 익히는 방법을 집중적으로 활용한다.
- 서치엔진왓치닷컴(SearchEngineWatch.com)

에릭과 오티스는 루씬 프로젝트의 핵심 커미터로서 그동안 쌓아온 경험을 이 책에 훌륭하게 녹여냈다. 이 책은 루씬이나 검색 엔진에 익숙하지 않은 개발자라 해도 루씬 프로젝트와 정보 검색 분야에 어렵지 않게 입문할 수 있도록 도와준다. 루씬을 처음 사용하거나, 개발중인 애플리케이션에 강력한 색인 및 검색 기능이 필요한 개발자, 또는 루씬에 대한 참고 서적을 찾고 있는 개발자 모두에게 추천한다.
- 포트 워스(Fort Worth) 자바 유저 그룹

정말 훌륭하다. 최신 버전을 폭 넓게 다룬다. 이 책으로 루씬이 갖고 있는 잠재력을 최대한 활용하는 방법을 배워보자.
- 밸의 블로그(Val’s blog)에서

... 예제 코드가 정말 유용하고 재사용하기에도 좋다.
- 스콧 가뇨(Scott Ganyo) 루씬 자바 커미터

... 말로 표현할 수 없을 만큼 강력한 검색 도구를 효율적으로 활용하는 방법에 대한 설명과 예제 코드가 가득하다.
- 브라이언 괴츠(Brian Goetz), 퀴오틱스 사

... 이 책으로 인해 루씬의 강력한 기능을 깨닫게 됐다.
- 리스 윌튼(Reece Wilton), 월트디즈니 인터넷 그룹

... 예제 코드와 JUnit 테스트 케이스는 엄청나게 큰 도움이 됐다.
- 노먼 리차즈(Norman Richards), 『XDoclet in Action』 공저자

루씬을 쉽고 빠르게 사용할 수 있도록 도와주는 최고의 안내서
- 북스 온라인

훌륭한 안내서다. 이 책의 저자는 루씬과 정보 검색 분야의 최고 전문가이며, 루씬의 강력한 힘을 소개하고 있다. 지금까지 본 책 중 루씬에 대해 가장 잘 설명한 책이다.
- 자바레퍼런스닷컴(JavaReference.com)


[ 추천의 글 ]

루씬은 순전히 개인적인 목적으로 시작했습니다. 1997년쯤이었죠. 직업도 맘에 들지 않고 해서 제 스스로 뭔가 만들어서 시장에 진출해봐야겠다는 생각을 했습니다. 또 자바라는 새로운 언어가 업계에서 인기를 끌고 있었기에 자바를 공부해볼 만한 프로젝트가 필요하기도 했었죠. 이전의 경험과 경력으로 검색 엔진을 어떻게 구성해야 한다는 것은 머릿속에 어느 정도 들어 있는 상태였기 때문에 자바로 검색 엔진을 만들어야겠다고 생각했습니다. 그리고는 루씬을 시작했죠.

2000년쯤 내 스스로가 사업에는 적성이 맞지 않다는 걸 깨달았습니다. 라이선스나 계약서 등을 신경 쓰고 관리하는 데는 별다른 관심이 없었죠. 관심이 없으니 제대로 해낼 리가 있었겠습니까? 더군다나 그런 상태에서 사람을 뽑아 회사를 운영하는 건 안 될 일이었습니다. 전 그저 소프트웨어를 만드는 게 좋았을 뿐이지 파는 데는 관심이 별로 없다고 판단했습니다. 그래서 유명한 오픈소스 개발 커뮤니티인 소스포지에 루씬 프로젝트를 올려보기로 했습니다. 과연 오픈소스로 공개하면 내가 원하는 방식으로 일을 할 수 있을지 궁금했습니다.

루씬을 오픈소스로 공개하자 일부 개발자들이 루씬을 사용하기 시작했습니다. 2001년에는 아파치 재단에서 루씬을 아파치 프로젝트에 참여시키는 게 어떠냐는 제안을 해왔고, 제안을 받아들여 아파치 자카르타 프로젝트에 참여하게 되었죠. 루씬 개발자 메일링 리스트에서 루씬을 개발하고 사용하는 개발자 간의 의견 전달 건수가 늘어나고, 개발자들은 자신들이 만든 각종 코드를 루씬에 추가하기 시작했습니다. 그렇지만 대부분 루씬을 활용하는 수준에서 그치는 프로그램이었고, 루씬의 핵심에 손을 대는 사람은 저 혼자였습니다. 여전히 루씬은 여러 개발자가 참여해 새로 만들어가는 과정에 있었다고 생각합니다.

2004년이 되자 루씬 관련 개발자 가운데 루씬의 핵심 부분까지 충분히 이해하는 사람들이 상당히 많아졌습니다. 요즘은 루씬 자체를 개발하는 데 제가 그다지 관여하지 않음에도 불구하고 다른 루씬 개발자들이 계속해서 루씬을 발전시키고 있습니다.

처음 개발된 이후 몇 년이 흐르는 동안 루씬은 C++을 비롯해 C#, 펄, 파이썬 등의 언어로도 포팅됐고, 자바를 비롯한 이 모든 ‘루씬’ 검색 엔진은 초기에 구상했던 것보다 훨씬 많이 사용되고 있음을 실감합니다. 어떤 언어로 만들어졌든지 루씬은 이제, 포춘지 선정 100대 기업들과 상용 버그 추적 시스템, 마이크로소프트의 아웃룩 이메일 검색 소프트웨어(루씬 기반의 Lookout이란 아웃룩 검색 소프트웨어가 있었으나 2004년에 마이크로소프트가 인수했다. - 옮긴이), 수십억 페이지의 인터넷 사이트를 검색할 수 있는 인터넷 검색 시스템까지 널리 사용되고 있으니 말이죠. 뿐만 아니라 요즘은 사람들이 저를 ‘루씬 창시자’라고 부르기도 하고, 자신들의 프로젝트에서 루씬을 어떻게 활용하는지 수다를 떨기도 합니다. 그렇게 여러 얘기를 듣다 보면 제가 상상했던 루씬의 응용 분야를 뛰어 넘어 정말 다양한 분야에서 루씬을 활용하고 있다는 생각도 많이 듭니다.

오픈소스 대신 예전 방식 그대로 사업을 했더라면 지금과 같은 루씬의 성공은 이루지 못했을 것입니다. 요즘 들어 소프트웨어 개발자들은 대부분 오픈소스를 선호합니다. 또 제품을 사고는 궁금한 걸 질문하기 위해 전화를 걸어 고객지원센터 직원에게 문제를 설명하느라 진땀 빼는 일은 하려들지 않습니다. 대신 공개된 소스코드를 보면서 뭐가 어떻게 돌아가는지 직접 파악해냅니다. 그게 개발자의 정서에는 더 맞는 방법이라고 생각합니다. 소스코드를 봐도 이해할 수 없다면 루씬 메일링 리스트에서 수많은 전문적인 루씬 개발자들이 서로 의견을 교환하고 질문에 답합니다. 물론 충분하진 않을 수 있지만, 루씬 메일링 리스트가 웬만한 상용 고객지원 서비스보다 훨씬 낫다고 자부합니다. 루씬처럼 제대로 자리 잡은 오픈소스 커뮤니티가 개발자들을 얼마나 편하게 해주는지도 새삼 느끼고 있습니다.

다시 말하지만 루씬을 오픈소스로 공개한 이후 얼마나 발전했는지 이루 헤아릴 수 없습니다. 제가 처음 시작한 게 맞기는 하지만, 수많은 루씬 커뮤니티 참여자들과 개발자들의 도움 덕분에 지금의 루씬이 존재하는 것입니다.

루씬으로 무엇을 할 수 있을까요? 차세대 루씬이라면 어떤 모습일까요? 이미 루씬을 공개한 지 10년이 지난 지금, 루씬은 여전히 씩씩하게 앞으로 나아가고 있으며, 사용자와 개발자 커뮤니티는 그 어느 때보다 크고 바쁘게 움직이고 있습니다. 특히 『루씬 인 액션』 초판이 출간되면서 더 많은 사람이 루씬을 사용하게 되었다는 점을 간과할 수 없겠죠. 루씬은 버전이 업그레이드될 때마다 더 안정적으로 많은 기능을 제공하며, 처리 속도도 개선되고 있습니다.

2004년에 『루씬 인 액션』이 처음 출간된 이후 루씬의 내부 구조와 외부의 API 모두 엄청나게 발전했으며, 이제 개정판이 절실한 시점이라고 생각합니다. 『(개정판) 루씬 인 액션』은 전체적으로 새로운 내용에 맞춰 내용을 고쳤으며, 루씬의 최신 API와 개선 사항을 소개합니다.

『루씬 인 액션』 개정판과 함께 루씬 커뮤니티에 합류했으니, 이제 루씬을 활용해 다음 단계로 올라설 차례입니다. 즐거운 여행을 기원합니다!

더그 커팅(Doug Cutting)
루씬, 너치, 하둡 프로젝트 창시자


[ 한국어판(초판) 출간에 부쳐 ]

저는 지금 『루씬 인 액션』 초판이 출간된 지 9개월 만에 한국어판의 서문을 쓰고 있습니다. 그동안 루씬과 너치에 대해 많이 배우고 경험했습니다. 저는 지금도 버지니아 대학의 ARP(Applied Research in Patacriticism) 팀에서 일하고 있습니다. 그동안 배우고 이 책에서 설명하기도 했던 루씬의 다양한 기능을 사용해 로제티 아카이브(Rossetti Archive)에서 강력한 전문 검색, 결과 하이라이팅, ‘비슷한 작품 보기’와 같은 기능을 구현할 수 있었습니다. 단테 가브리엘 로제티가 쓴 작품 중에서 1860년에서 1870년 사이에 쓰였고 ‘love’와 인접한 ‘wife’ 단어를 포함하는 모든 시를 찾고 싶다면 어떻게 하시겠습니까? 루씬이라면 쉽게 답을 찾을 수 있습니다!

현재 저는 ‘구글’, ‘플리커’, ‘del.icio.us’의 19세기 문학 버전에 해당하며 HTML, URL, JPEG 파일보다 훨씬 다양한 메타 정보를 관리할 수 있는 사이트 구축 프로젝트에 참여하고 있습니다. 너치는 연합된 NINES(19세기 전자 장학재단을 위한 네트워크 인터페이스) 사이트에서 숨겨진 RDF 데이터를 포함한 다양한 정보를 수집할 때 중요한 역할을 담당합니다. 사용자 정의 형태로 작성된 루씬의 색인 코드는 브라우징과 전문 검색 수행이 용이하게 수집된 데이터를 처리합니다. 학자들은 독립적인 형태의 기록 저장소에 걸쳐 존재하는 내용을 조회하고, 자신만의 수집 목록에 추가하고, 개체와 다른 학자 사이의 상관관계를 탐색할 수 있을 것입니다. 수집된 개체를 이용해 목록을 만들고, 출판할 수 있고, 그 결과로 자신만의 개체를 최상위 정보로 시스템에 피드백할 수 있습니다. 이 책을 쓰는 동안 이와 같은 구조를 증명하기 위해 시스템을 설계하고 프로토타입을 만들었습니다. 곧 이 시스템을 NINES에 설치할 예정입니다. 관심을 갖고 http://www.nines.org/를 지켜봐 주세요!

ARP 외에도 다양한 SpanQuery군을 제공하는 사용자 정의 질의 파서 개발에 대해 컨설팅도 하고, 이런 과정에서 좀 더 발전된 코드는 루씬에 다시 반영하기도 했습니다. 이 기회에 오픈소스로서 루씬이 갖는 장점을 강조하고 싶고, 더불어 루씬을 처음 공개한 더그 커팅에게 다시 한 번 감사드립니다. 루씬은 헌신적인 수많은 개발자들의 노력으로 발전되어 왔습니다. 루씬 관련 커뮤니티(특히 자바 유저 메일링 리스트)에서는 엄청난 도움을 받을 수 있고, 활발하게 교류하고 있습니다. 여러분도 저희와 함께 하시기를 바랍니다.

2005년 9월 15일
텍사스주 댈러스의 자바 사용자 그룹에서
루씬에 대해 발표하고 돌아오는 비행기 안에서
에릭 해쳐



루씬이 어느덧 8살이 되었군요. 곧 다가올 영문판 『루씬 인 액션』의 첫 번째 생일을 즈음해 저희 책이 한글판으로 새롭게 탄생하는 경사스러운 일에 함께 하게 되어 더없이 기쁩니다.
『루씬 인 액션』이 출간된 이후에도 루씬 프로젝트는 끊임없이 발전해오고 있습니다. 개별 프로젝트였던 너치는 이제 루씬의 하위 프로젝트가 됐고, 왕성하게 활동하는 개발자들 덕분에 튼튼한 그룹으로 만들어졌습니다. http://lucene.apache.org에서 보듯이 루씬도 아파치 소프트웨어 재단ASF의 최상위 프로젝트로 성장했습니다. 또 9장에서 다룬 루씬의 일부 포팅 버전도 하위 프로젝트로 ASF에 추가됐습니다. 루씬의 이슈 트래킹 시스템인 지라(JIRA)는 점점 더 커지고 있습니다. 물론 버그가 아닌 수많은 개발자의 헌신과 확장을 통해서 말입니다.

『루씬 인 액션』은 2005년 8월 슬래시닷에서 리뷰점수 10점 만점에 9점을 받았습니다. 이 책의 공식 사이트인 http://lucenebook.com/은 슬래시닷 사이트를 통해 접속해오는 사용자 때문에 부하를 좀 겪었지만, 역시 죽지 않고 살아남았습니다. 몇 년 동안 저는 여러 개의 루씬 프로젝트에 참여해왔는데, 그 중에서도 심피 프로젝트는 가장 인상 깊었습니다. 심피는 수천 명의 사용자에게 제공되고 있고, 루씬을 중심으로 소셜 북마크 서비스에 태그 처리, 전문 검색 등 수많은 기능을 제공하고 있습니다. 또 심피 이외에도 루씬에 대한 컨설팅을 시작했고, 나날이 늘어나는 루씬의 인기를 지켜보면서 눈에 띄는 일부 프로젝트에 서비스를 제공했습니다.

마지막으로 한국 독자들이 『루씬 인 액션』을 더 많이 읽을 수 있게 이 책을 번역해주신 역자들에게 감사드립니다.

2005년 9월 15일
미국 뉴욕주 브루클린에서
오티스

저자/역자 소개

[ 저자 서문 ]

루씬을 처음 사용하기 시작한 건 『루씬 인 액션』 초판이 출간된 지 1년 정도 지나서였습니다. 루씬을 사용하기 전에도 검색 엔진을 사용해본 경험이 있지만, 루씬 자체에 대해서는 별로 알지 못하는 상태였죠. 그래서 에릭과 오티스가 저술했던 『루씬 인 액션』을 손에 들고 읽기 시작했는데, 이후에는 완전히 루씬에 사로잡히고 말았습니다.

처음 루씬을 사용할 때 여기저기에 자잘하게 개선할 부분이 보여 조금씩 코드를 고치기도 하고, 문서를 작성하기도 하고, 루씬 메일링 리스트에서 특정 주제를 놓고 토의도 하기 시작했습니다. 결과적으로는 이후에 아파치 프로젝트의 커미터가 되어 수년간 다양한 코드를 커밋했고, PMC(Project Management Committee), 프로젝트 관리 위원회에도 참여하고 있습니다.

『루씬 인 액션』 초판이 출간된 지 벌써 4년 반이 흘렀는데, 엄청나게 빠르게 변화하는 오픈소스 세계에서 4년 반이면 엄청나게 오랜 시간이라고 볼 수 있죠. 그동안 루씬은 두 번의 메이저 업그레이드를 거쳤고, 지금은 수많은 새로운 기능을 갖고 있습니다. 예를 들어 숫자 필드도 있고, 재사용하기 좋은 분석기 API도 있고, 적재 기능도 있고, 준실시간 검색 기능도 있고, 색인과 검색에 대한 트랜잭션도 지원합니다.

매닝 출판사와 연락하기 시작했을 때는 『루씬 인 액션』의 개정판이 필요한 시점이었습니다. 또한 활발하게 활동하는 커미터의 한 명으로서 수많은 코드를 커밋하고 추가된 기능에 대한 설명을 해야 할 필요가 있겠다는 약간의 책임감도 느끼고 있었죠. 그래서 『루씬 인 액션』 개정판 작업에 참여하기로 하고, 루씬에 새로 추가된 내용에 대해 설명하는 원고를 정말 열심히 작성했으며, 그 결과에도 상당히 만족하고 있습니다. 검색 애플리케이션을 개발하고 있다면 『(개정판) 루씬 인 액션』이 큰 도움이 되리라 믿으며, 사용자 또는 개발자 메일링 리스트에서 재미있는 질문에 대해 함께 토론하고, 루씬이 계속해서 발전할 수 있도록 도와주길 바랍니다.
- 마이클 맥캔들리스


인터넷이 처음 시작될 무렵부터 검색이나 색인과 같은 작업을 이래저래 시작했습니다. 1991년쯤에는 majordomo, MUSH(Mail User's Shell)에 펄과 awk를 셸 스크립트로 묶어 메일링 리스트를 관리하는 프로그램을 만들기도 했죠. 그 때는 grep을 이용해 메일링 리스트에 저장된 메일과 사용자 정보를 검색할 수 있는 프로그램을 CGI로 구현해 웹으로 사용할 수 있게 만들었습니다. 그러고 나서 야후!를 비롯해 알타비스타나 익사이트와 같은 검색 사이트가 나타났고요.

첫 아이인 제이콥이 태어난 이후로 디지털 카메라로 찍은 사진들이 엄청나게 늘어나기 시작했습니다. 사진이 많아지니 관리하기도 어려워서 ‘간단한 사진 관리 프로그램’을 만들어보려 했습니다. 사진마다 날짜나 주제어, 찍은 장소 등을 미리 입력해두고 원하는 정보를 기준으로 쉽게 찾아볼 수 있는 것이었죠. 90년대 말에는 마이크로소프트의 제품군을 기반으로 만들어보려 했습니다. 이를테면 인덱스 서버, ASP, 영상 처리를 위한 COM 객체 등을 사용하는 거죠. 그 당시에는 이런 제품들로 작업하는 직업을 갖기도 했고, 이들을 잘 조합해 며칠 작업하면 프로그램 하나를 뚝딱 만들 수가 있었습니다.

시간이 흐르다 보니 직업적으로 마이크로소프트의 제품을 사용하는 일은 줄어들고, 점점 자바 언어를 사용하는 경우가 많아졌습니다. 예전에 만들었던 사진 관리 프로그램을 자바, 특히 플랫폼 독립적으로 만들려다 보니 루씬을 사용하게 됐습니다. 루씬은 기대했던 것보다 훨씬 사용하기 쉽더군요. 여러 오픈소스 프로젝트의 라이브러리를 많이 사용해봤지만 루씬처럼 간단한 것은 별로 없었습니다.

2001년에는 스티브 로런(Steve Loughran)과 『Java Development with Ant』라는 책을 써서 매닝 출판사에서 출간했습니다. 예전의 사진 관리 프로그램을 ‘문서 관리 프로그램’으로 좀 더 확장해 이 책에 예제로 넣었는데, 조금만 확장하면 이미지 검색 엔진으로도 사용할 수 있는 수준이었죠. 앤트(Ant)와 루씬이 연결되는 건 단순히 컴파일하고 패키징하는 앤트의 기능 외에도 라는 앤트 태그 때문이었습니다. 태그를 이용해 프로그램을 빌드하는 도중에 색인을 구축할 수 있었죠. 이때 만들었던 태그는 아직도 사용되며 현재 루씬 샌드박스에서 찾아볼 수 있고, 『루씬 인 액션 1판』 의 8.4절에서도 볼 수 있습니다.

이렇게 만들었던 태그는 제 개인 블로그인 블로그씬(BlogScene)(http://www.blogscene.org/erik/)에서도 사용하고 있습니다. 블로그씬에서 글을 쓰면 자동으로 앤트 작업이 돌아가게 했고, 태그를 통해 제가 쓴 글을 색인에 추가하고 서버에 저장합니다. 블로그씬 서버는 서블릿(servlet), 벨로시티 템플릿, 루씬을 사용해 다양한 검색 쿼리를 사용할 수 있고, 통합 연동까지 가능하죠. 다른 많은 블로깅 제품만큼 장점이 많지는 않지만 루씬을 사용한 검색만큼은 최고임이 분명합니다.

요즘은 버지니아 주립대학에서 ARP(Applied Research in Patacriticism) 프로젝트에 참여하고 있습니다. 저는 물론 텍스트 분석과 색인, 검색과 관련한 경험을 살리고 양자 물리학이 문학에 어떤 영향을 미쳤는지에 대해 토론하며 안목을 넓히고자 합니다.
“문학은 이 세상에 알려지지 않은 공학도이다.”
- 에릭 해쳐


제가 미들베리 대학(Middlebury College)에 다닐 때부터 정보 검색과 관리에 흥미와 관심을 갖기 시작했습니다. 그때쯤 인터넷과 웹이 엄청난 정보의 바다라는 걸 깨달았고, 아직 초창기였지만 장기적으로는 웹에서 찾아볼 수 있는 자료를 모아서 분석, 관리하고 검색할 수 있으면 좋겠다고 생각하고 있었습니다. 곧 웹에서 정보를 수집하는 프로그램을 만들어 수집한 정보를 쌓아두다 보니, 그 많은 자료 가운데 필요한 정보를 검색할 필요가 생겼습니다. 특히 검색 기능이야말로 아직 알려지지 않았지만 훗날 인터넷 세상에서 꼭 필요한 기능이 되리라 짐작하고 있었죠. 이런 생각에 모든 작업에 항상 필요한 수집과 검색 두 가지 기능에 대한 프로젝트를 시작했습니다.

1995년경 학교 동기인 마샬 레빈(Marshall Levin)과 개인 주소록 정보를 모아두고 찾아볼 수 있는 WebPh라는 오픈소스 프로젝트를 만들었습니다. 말이야 거창하지만 간단한 개인 주소록을 웹 CGI로 구현한 것뿐이었는데, 그 당시를 생각해보면 요즘 PIMS개인 정보 관리 시스템라고 말하는 프로그램의 초창기였다고 생각됩니다(심지어는 90년대 후반 어느 법정에서 선구적인 작품으로 언급되기도 했습니다). 대학이나 정부 기관에서 WebPh를 많이 사용했고, 아직까지도 사용하고 있는 걸로 알고 있습니다. 1997년에는 WebPh를 만들었던 경험을 살려 파퓰러스(Populus)라는 나름대로 인기 있었던 일종의 전화번호부 서비스를 시작했습니다. 기술 자체는 WebPh와 별반 다를 게 없었지만, 파퓰러스는 그 당시 유명하던 WhoWhere, BigFoot, Infospace 같은 서비스에 뒤처지지 않는 서비스였다고 생각됩니다.

위의 두 가지 프로젝트에서 개인 정보 관리를 목표로 했었으니, 새로운 사업 영역을 찾아볼 차례였죠. 그래서 인포점프(Infojump)라는 벤처를 시작했는데, 수많은 온라인 신문이나 뉴스레터, 저널, 잡지 등의 내용을 수집하고 제공하려는 시도였습니다. 인포점프는 직접 만들었던 수많은 펄 스크립트와 웨비네이터(Webinator)라는 웹사이트 수집 프로그램과 텍시스(Texis)라는 텍스트 검색 엔진을 사용했습니다. 인포점프는 요즘 서비스하고 있는 FindArticle.com이라는 사이트와 비슷하죠.

WebPh와 파퓰러스, 인포점프가 기술적으로 목표한 바를 충분히 달성하긴 했지만, 모두 기술적 한계를 갖고 있었죠. 역파일 색인 같은 훌륭한 구조를 가진 성능 좋은 텍스트 검색 라이브러리를 알고 있었다면 훨씬 나은 서비스를 제공할 수 있었으리라 생각합니다. 그런 라이브러리를 만들기보다는 오픈소스에서 찾아보려 했는데, 2000년쯤 찾아낸 게 바로 루씬이었습니다. 뭔가 빠진 것 같던 바로 그 부분을 채워주는 오픈소스 프로젝트였죠!

그래서 루씬이 소스포지에서 개발될 당시부터 프로젝트에 참여했고, 루씬은 점점 제가 작업하는 프로젝트의 핵심 부분을 차지하기 시작했습니다. 그 중의 하나는 취미로 만들기 시작한 심피(Simpy)(http://www.simpy.com/)인데, 사용자들이 웹에서 찾아낸 정보들을 올려두고 서로 공유하며 검색해볼 수 있는 서비스죠. 심피는 루씬이 없으면 만들 수 없었다고 생각될 만큼 루씬을 기반으로 하고, 더그 커팅의 또 다른 프로젝트인 너치(『루씬 인 액션 1판』의 10장 참조)를 통해 수천 개의 색인을 관리하고 있습니다. 루씬 커뮤니티에서 활발하게 활동하다 보니 매닝 출판사에서 에릭 해쳐와 함께 루씬 책을 써보지 않겠냐는 제의가 있었던 거구요.

『루씬 인 액션』은 최강의 오픈소스 검색 엔진 루씬 관련 기술과 정보를 하나로 모은 최고의 책이라고 자부합니다. 루씬의 기초부터 고급 기술까지 여러 장에 걸쳐 살펴보는데, 루씬을 이용해 검색 기능을 구현하려 할 때 꼭 필요한 정보와 지식을 싣고 있습니다. 이 책을 쓰는 동안 루씬 커뮤니티에서 활동하던 것과 비슷하게 에릭을 비롯한 다른 커뮤니티 구성원과 어울려 손쉽게 작업할 수 있었습니다. 루씬과 『루씬 인 액션』을 함께 작업하다 보니, 직접 얼굴을 맞대지 않더라도 공통의 관심사만 있다면 각자의 지식과 경험을 한군데에 모아 뭔가를 만들어내는 게 충분히 가능하다는 걸 새삼 느끼게 됐습니다.
- 오티스 고스포드네티치


[ 저자 소개 ]

마이클 맥캔들리스 (Michael McCandless)
이미 10년 이상 검색 엔진 분야에서 일하고 있다. 1999년에는 다른 세 명과 의기투합해 파이썬과 C++ 언어로 사용자 기반의 기업용 검색 엔진 소프트웨어를 개발하는 아이프레이즈 테크놀로지스(iPhrase Technologies)를 창업했다. 그리고 이 회사를 2005년에 IBM이 인수한 후, 루씬을 사용하기 시작한 마이클은 코드를 여러 번 고쳐 제공하기도 했다. 결국 2006년에는 루씬 프로젝트의 커미터가 됐고, 2008년에는 PMC 위원으로 활동하기 시작했다. 마이클은 MIT에서 학사, 석사, 박사를 마쳤고 현재 매사추세츠 주의 렉싱턴에서 아내와 네 아이 미아(Mia), 카이라(Kyra), 조엘(Joel), 카일(Kyle)과 함께 살고 있다. 마이클은 http://chbits.blogspot.com블로그를 운영하고 있다.

에릭 해쳐 (Erik Hatcher)
기술적으로 재미있고 도전해 볼만한 일과 관련한 프로그램을 만들고 글도 쓰며 강연도 해오고 있다. 이미 여러 분야에서 다양한 프로그래밍 언어를 사용해 소프트웨어를 만들었으며, 스티브 로런(Steve Loughran)과 함께 업계에서 알아주는 책 중 하나인 『Java Development with Ant』(Manning, 2002)을 쓰기도 했다. 첫 번째 책인 『Java Development with Ant』를 출판한 이후 노플러프 저스트스터프(No Fluff, Just Stuff) 심포지엄이나 자바원(JavaOne) 컨퍼런스, 오라일리의 오픈 소스 컨벤션(Open Source Convention), 자바존(JavaZone), 디복스(devoxx), 각종 자바 사용자 그룹 모임, 그리고 여러 웨비나 등에서 강연을 해왔다. 현재 아파치 소프트웨어 재단의 회원으로 활동중이며 루씬과 솔라를 포함해 여러 프로젝트에서 왕성하게 활동 중이다. 에릭이 최근 가장 좋아하는 기술로는 솔라, 솔라리타스(Solritas), 플레어(Flare), 블랙라이트(Blacklight), 솔라-루비(solr-ruby) 등이 있으며, 그 중에도 솔라를 활용해 멋진 사용자 경험을 끌어내는 데 재미를 붙이고 있다. 현재 오픈소스 검색 엔진을 활용한 다양한 서비스를 제공하는 루시드 이매지네이션(Lucid Imagination)을 공동 창업해 일하고 있으며, 버지니아 주 중부 지방에 살고 있다.

오티스 고스포드네티치 (Otis Gospodnetic)
루씬이 아파치 재단으로 옮겨온 이후부터 루씬 프로젝트에 참여했다. 검색(특히 루씬, 솔라, 너치 등)과 관련한 서비스와 제품, 그리고 빅데이터 분석 서비스(하둡 등)를 제공하는 시마텍스트(Sematext)를 공동 창업해 일하고 있다. 지난 수년간 루씬과 솔라에 대한 강연을 해왔으며, 오라일리 네트워크나 IBM의 디벨로퍼웍스(developerWorks) 등에 루씬 관련 글을 여러 차례 기고했다. 얼마 전에는 자신의 경험을 살려 미국에서 공부하고자 하는 외국인을 대상으로 하는 『To Choose and Be Chosen: Pursuing Education in America』라는 책을 저술하기도 했다. 오티스는 현재 뉴욕 시에 살고 있으며, NY Search & Discovery 모임을 주도하고 있다.


[ 옮긴이의 말 ]

2005년에 『루씬 인 액션』 초판을 출간한 이후 루씬은 눈부시게 발전해왔습니다. 루씬 2.x 버전으로도 정말 다양한 검색 애플리케이션을 충분히 만들 수 있었지만, 버전 3.x와 4.x를 거치면서 정말 많은 기능을 추가하며 성능도 개선됐고, 이런 발전 과정과 함께 계속해서 내부적인 구조를 바로잡아 가는 리팩토링을 거치고 있기도 합니다.

국내에서도 최근 루씬 사용자 층이 넓어지면서 소스코드가 공개되거나 공개되지 않은 한글 형태소 분석기가 나타나고 있습니다. 예를 들어 ‘한글 형태소 분석기’라고 검색해보면 테스트 용도나 상업적인 용도로 사용할 수 있는 루씬 분석기 형태의 클래스를 받아와 적용할 수 있습니다.

또한 한글을 담고 있는 아래아 한글(.hwp), 마이크로소프트 오피스(.doc, .ppt, .xls) 등의 문서도 몇 년 전보다 훨씬 처리하기가 쉬워졌습니다. 특히 『(개정판) 루씬 인 액션』에서 소개하는 아파치 티카(Apache Tika) 프로젝트를 사용하면 마이크로소프트 오피스 문서를 포함해 다양한 문서를 한 번에 손쉽게 처리할 수 있고, 필요한 경우 아래아 한글 역시 SDK를 제공하고 있으니 라이선스를 얻어 사용할 수 있습니다.

요즘에는 루씬을 직접 호출하는 대신 아파치 솔라(Apache Solr)나 일래스틱서치(Elastic Search) 등 루씬 기반 검색 서버를 사용하는 경우도 많습니다. 둘 다 오픈소스 프로젝트이며, HTTP REST 스타일의 API를 제공해 사용하기 편리하고, 검색할 대상 문서의 양이 많아지더라도 분산 검색 기능 등을 통해 손쉽게 확장할 수 있기 때문이죠. 그렇더라도 솔라와 일래스틱서치 등에서 핵심 역할을 맡고 있는 루씬에 대해 충분히 이해하고 있어야 최적의 결과를 얻을 수 있습니다. 특히 검색 결과가 올바르게 나오지 않거나 속도에 문제가 있는 경우 루씬의 내부 구조와 동작하는 방법을 알아야 적절히 대응할 수 있습니다.

한국어판이 출간되는 2013년 8월 현재 루씬의 최신 버전은 4.4이며, 2.x 버전과는 물론 3.x 버전과 비교해도 API가 엄청나게 많이 바뀌었습니다. 이 책의 예제는 3.0.1 버전을 기준으로 작성했으며, 루씬 웹사이트에서 3.x 버전을 내려받아 사용하면 모든 예제를 돌려볼 수 있습니다.

『(개정판) 루씬 인 액션』을 발판 삼아 최고의 성능을 자랑하는 루씬 검색 엔진을 활용하는 멋진 애플리케이션, 모바일 앱 또는 웹사이트를 만들어보시기 바랍니다.
강철구


[ 옮긴이 소개 ]

강철구
컴퓨터 비전(영상 인식)을 전공했으며, 검색 엔진, 인공 지능, 모바일 등의 키워드에 관심이 많고, 현재 캐나다에서 소프트웨어 개발자로 일하고 있다. 에이콘출판사에서 출간한 『루씬 인 액션』(2005년)과 『Ajax 인 액션』(2006년), 『자바 병렬 프로그래밍』(2008년), 『알짜만 골라 배우는 안드로이드 프로그래밍』(2009년), 『아이폰북』(2009년), 『(개정판)알짜만 골라 배우는 안드로이드 프로그래밍2』(2010년),『아이폰 개발자를 위한 아이패드 프로그래밍』(2010년)을 번역했다.

목차

목차
  • 1부 루씬 기초
  • 1장 루씬과의 만남
    • 1.1 정보 홍수의 시대
    • 1.2 루씬이란?
      • 1.2.1 루씬으로 처리하기 좋은 기능
      • 1.2.2 루씬의 역사
    • 1.3 루씬과 검색 애플리케이션의 구조
      • 1.3.1 색인 과정 구성 요소
      • 1.3.2 검색 과정 구성 요소
      • 1.3.3 검색 애플리케이션의 나머지 요소
      • 1.3.4 루씬과 검색 애플리케이션
    • 1.4 루씬 인 액션 : 예제 애플리케이션
      • 1.4.1 색인 생성
      • 1.4.2 색인의 내용 검색
    • 1.5 색인 관련 핵심 클래스
      • 1.5.1 IndexWriter
      • 1.5.2 Directory
      • 1.5.3 Analyzer
      • 1.5.4 Document
      • 1.5.5 Field
    • 1.6 검색 관련 핵심 클래스
      • 1.6.1 IndexSearcher
      • 1.6.2 Term
      • 1.6.3 Query
      • 1.6.4 TermQuery
      • 1.6.5 TopDocs
    • 1.7 정리
  • 2장 색인
    • 2.1 루씬 데이터 모델
      • 2.1.1 문서와 필드
      • 2.1.2 유연한 스키마
      • 2.1.3 비정규화
    • 2.2 색인 절차
      • 2.2.1 텍스트 추출과 문서 생성
      • 2.2.2 분석
      • 2.2.3 색인에 토큰 추가
    • 2.3 기본 색인 작업
      • 2.3.1 색인에 문서 추가
      • 2.3.2 색인에서 문서 삭제
      • 2.3.3 색인의 문서 변경
    • 2.4 필드별 설정
      • 2.4.1 색인 관련 설정
      • 2.4.2 필드의 원문 저장 관련 설정
      • 2.4.3 텀 벡터 관련 설정
      • 2.4.4 Reader, TokenStream, byte[] 필드
      • 2.4.5 유용한 필드 설정 조합
      • 2.4.6 정렬 관련 설정
      • 2.4.7 다중 값 필드
    • 2.5 문서와 필드 중요도
      • 2.5.1 문서 중요도
      • 2.5.2 필드 중요도
      • 2.5.3 norm
    • 2.6 숫자, 날짜, 시각 색인
      • 2.6.1 숫자 색인
      • 2.6.2 날짜, 시각 색인
    • 2.7 필드 길이
    • 2.8 준실시간 검색
    • 2.9 색인 최적화
    • 2.10 여러 종류의 Directory
    • 2.11 병렬 처리, 스레드 안전성, 락
      • 2.11.1 스레드와 다중 JVM 안전성
      • 2.11.2 원격 파일 시스템의 색인 공유
      • 2.11.3 색인 락
    • 2.12 색인 작업 디버깅
    • 2.13 고급 색인 기법
      • 2.13.1 IndexReader에서 문서 삭제
      • 2.13.2 삭제된 문서가 차지하는 디스크 공간
      • 2.13.3 문서 버퍼, 플러시
      • 2.13.4 색인 커밋
      • 2.13.5 ACID 트랜잭션과 색인의 일관성
      • 2.13.6 병합
    • 2.14 정리
  • 3장 검색
    • 3.1 간단한 검색 기능 구현
      • 3.1.1 텀 검색
      • 3.1.2 QueryParser로 사용자가 입력한 검색어 파싱
    • 3.2 IndexSearcher 활용
      • 3.2.1 IndexSearcher 인스턴스 생성
      • 3.2.2 검색 실행
      • 3.2.3 TopDocs 결과 활용
      • 3.2.4 결과 페이지 이동
      • 3.2.5 준실시간 검색
    • 3.3 연관도 점수
      • 3.3.1 점수 계산
      • 3.3.2 explain() 메소드로 점수 내역 확인
    • 3.4 다양한 종류의 질의
      • 3.4.1 TermQuery 텀 검색
      • 3.4.2 TermRangeQuery 텀 범위 검색
      • 3.4.3 NumericRangeQuery 숫자 범위 검색
      • 3.4.4 PrefixQuery 접두어 검색
      • 3.4.5 BooleanQuery 불리언 질의
      • 3.4.6 PhraseQuery 구문 검색
      • 3.4.7 WildcardQuery 와일드카드 검색
      • 3.4.8 FuzzyQuery 비슷한 단어 검색
      • 3.4.9 MatchAllDocsQuery 모든 문서 조회
    • 3.5 QueryParser로 질의 표현식 파싱
      • 3.5.1 Query.toString
      • 3.5.2 TermQuery
      • 3.5.3 텀 범위 검색
      • 3.5.4 숫자와 날짜 범위 검색
      • 3.5.5 접두어 질의와 와일드카드 질의
      • 3.5.6 불리언 연산자
      • 3.5.7 구문 질의
      • 3.5.8 퍼지 검색
      • 3.5.9 MatchAllDocsQuery
      • 3.5.10 질의 그룹
      • 3.5.11 필드 선택
      • 3.5.12 하위 질의에 중요도 지정
      • 3.5.13 과연 QueryParser를 사용해야 하는가?
    • 3.6 정리
  • 4장 루씬의 텍스트 분석
    • 4.1 분석기 활용
      • 4.1.1 색인 과정의 분석기
      • 4.1.2 QueryParser와 분석기
      • 4.1.3 파싱과 분석의 차이점
    • 4.2 분석기 내부 구조
      • 4.2.1 토큰
      • 4.2.2 TokenStream
      • 4.2.3 분석기 결과 확인
      • 4.2.4 TokenFilter 순서의 중요성
    • 4.3 루씬 내장 분석기
      • 4.3.1 StopAnalyzer
      • 4.3.2 StandardAnalyzer
      • 4.3.3 어떤 분석기를 사용해야 할까?
    • 4.4 유사 발음 검색
    • 4.5 유사어 검색
      • 4.5.1 유사어 분석기 작성
      • 4.5.2 토큰 위치 증가 값 확인
    • 4.6 기본형 분석기
      • 4.6.1 StopFilter와 빈 공간
      • 4.6.2 기본형 찾기와 불용어 처리 방법 변경
    • 4.7 필드 유형별 처리
      • 4.7.1 동일한 이름의 필드
      • 4.7.2 필드별 분석기 지정
      • 4.7.3 분석하지 않은 필드 검색
    • 4.8 언어별 분석
      • 4.8.1 유니코드와 인코딩
      • 4.8.2 비영어권 언어 분석
      • 4.8.3 글자 정규화
      • 4.8.4 아시아 언어 분석
      • 4.8.5 Zaijian
    • 4.9 너치 분석
    • 4.10 정리
  • 5장 고급 검색 기법
    • 5.1 필드 캐시
      • 5.1.1 모든 문서의 필드 값 불러오기
      • 5.1.2 세그먼트별 IndexReader
    • 5.2 검색 결과 정렬
      • 5.2.1 필드 값으로 정렬
      • 5.2.2 연관도 순서 정렬
      • 5.2.3 색인 순서 정렬
      • 5.2.4 필드 값으로 정렬
      • 5.2.5 정렬 순서 변경
      • 5.2.6 여러 필드의 값으로 정렬
      • 5.2.7 정렬할 필드 자료형 선택
      • 5.2.8 정렬할 로케일 지정
    • 5.3 MultiPhraseQuery 활용
    • 5.4 여러 개의 필드를 동시에 검색
    • 5.5 스팬 질의
      • 5.5.1 SpanTermQuery
      • 5.5.2 필드의 맨 앞부분 검색
      • 5.5.3 일정 범위 안에 위치한 스팬 검색
      • 5.5.4 겹치는 부분을 결과에서 제외
      • 5.5.5 SpanOrQuery
      • 5.5.6 스팬 질의와 QueryParser
    • 5.6 검색 필터
      • 5.6.1 TermRangeFilter
      • 5.6.2 NumericRangeFilter
      • 5.6.3 FieldCacheRangeFilter
      • 5.6.4 특정 텀으로 필터링
      • 5.6.5 QueryWrapperFilter
      • 5.6.6 SpanQueryFilter
      • 5.6.7 보안 필터
      • 5.6.8 필터와 BooleanQuery
      • 5.6.9 PrefixFilter
      • 5.6.10 필터 캐시
      • 5.6.11 필터를 질의로 변환
      • 5.6.12 필터에 필터 적용
      • 5.6.13 내장 필터에서 제공하지 않는 기능
    • 5.7 함수 질의와 연관도 점수
      • 5.7.1 함수 질의 클래스
      • 5.7.2 최근 문서에 중요도를 높게 부여하는 함수 질의
    • 5.8 다수의 루씬 색인 검색
      • 5.8.1 MultiSearcher
      • 5.8.2 스레드를 활용하는 ParallelMultiSearcher
    • 5.9 텀 벡터 활용
      • 5.9.1 비슷한 책 조회
      • 5.9.2 자동 분류
      • 5.9.3 TermVectorMapper
    • 5.10 FieldSelector로 필드 선택
    • 5.11 검색 중단
    • 5.12 정리
  • 6장 검색 기능 확장
    • 6.1 정렬 기능 직접 구현
      • 6.1.1 색인 시점에 필요한 준비
      • 6.1.2 거리 기준 정렬 기능 구현
      • 6.1.3 정렬할 때 계산한 값 활용
    • 6.2 Collector 클래스 직접 구현
      • 6.2.1 Collector 클래스
      • 6.2.2 Collector 직접 구현: BookLinkCollector
      • 6.2.3 AllDocCollector
    • 6.3 QueryParser 확장
      • 6.3.1 QueryParser의 기능 변경
      • 6.3.2 퍼지와 와일드카드 질의 제한
      • 6.3.3 숫자 범위 질의 처리
      • 6.3.4 날짜 범위 질의 처리
      • 6.3.5 순서가 정해진 구문 질의
    • 6.4 필터 직접 구현
      • 6.4.1 필터 구현
      • 6.4.2 직접 구현한 필터 적용
      • 6.4.3 필터를 적용하는 다른 방법: FilteredQuery
    • 6.5 적재
      • 6.5.1 분석과 적재
      • 6.5.2 검색 중 적재된 값 활용
      • 6.5.3 스팬 질의와 적재
      • 6.5.4 TermPositions로 적재된 내용 확보
    • 6.6 정리
  • 2부 고급 루씬
  • 7장 티카로 텍스트 추출
    • 7.1 티카란?
    • 7.2 티카의 논리적인 구조와 API
    • 7.3 티카 설치
    • 7.4 티카에 내장된 텍스트 추출 도구
    • 7.5 텍스트 추출 기능 활용
      • 7.5.1 루씬 문서 색인
      • 7.5.2 Tika 도우미 클래스
      • 7.5.3 파서 선택
    • 7.6 티카의 한계
    • 7.7 XML 색인
      • 7.7.1 SAX 파싱
      • 7.7.2 아파치 커먼스 다이제스터
    • 7.8 티카의 대안
    • 7.9 정리
  • 8장 필수 확장 기능
    • 8.1 루크
      • 8.1.1 Overview 탭: 색인 개요
      • 8.1.2 문서 조회
      • 8.1.3 QueryParser를 사용해 검색
      • 8.1.4 파일과 플러그인
    • 8.2 분석기와 토큰 필터
      • 8.2.1 스노볼 분석기
      • 8.2.2 N그램 필터
      • 8.2.3 싱글 필터
      • 8.2.4 contrib 모듈 분석기 활용
    • 8.3 검색 질의 하이라이팅
      • 8.3.1 하이라이팅 모듈
      • 8.3.2 단독 실행 예제
      • 8.3.3 CSS 하이라이팅
      • 8.3.4 검색 결과 하이라이팅
    • 8.4 FastVectorHighlighter
    • 8.5 검색어 추천
      • 8.5.1 추천 검색어 후보 추출
      • 8.5.2 최적의 추천 단어 선택
      • 8.5.3 추천 검색어를 화면에 표시
      • 8.5.4 추천 기능을 개선할 아이디어
    • 8.6 특이한 Query
      • 8.6.1 MoreLikeThis
      • 8.6.2 FuzzyLikeThisQuery
      • 8.6.3 BoostingQuery
      • 8.6.4 TermsFilter
      • 8.6.5 DuplicateFilter
      • 8.6.6 RegexQuery
    • 8.7 contrib 모듈 빌드
      • 8.7.1 소스코드 확보
      • 8.7.2 contrib 디렉토리에서 ant 실행
    • 8.8 정리
  • 9장 추가 확장 기능
    • 9.1 필터 연결
    • 9.2 버클리DB Directory
    • 9.3 워드넷 유의어 사전
      • 9.3.1 유의어 색인 구축
      • 9.3.2 분석기에서 워드넷 유의어 활용
    • 9.4 메모리 기반 색인
    • 9.5 XML QueryParser
      • 9.5.1 XmlQueryParser 활용
      • 9.5.2 XML 질의 문법 확장
    • 9.6 서라운드 질의 언어
    • 9.7 지리적인 위치 정보 검색
      • 9.7.1 지리 정보 색인
      • 9.7.2 공간 정보 검색
      • 9.7.3 위치 정보 검색과 성능
    • 9.8 원격 서버의 여러 색인 검색
    • 9.9 유연한 QueryParser
    • 9.10 작고 다양한 확장 기능
    • 9.11 정리
  • 10장 다른 언어에서 루씬 활용
    • 10.1 포팅이란?
      • 10.1.1 장단점
      • 10.1.2 적당한 포팅 방법 선택
    • 10.2 CLucene(C++)
      • 10.2.1 개발 동기
      • 10.2.2 API와 색인 호환성
      • 10.2.3 지원하는 플랫폼
      • 10.2.4 현황과 미래
    • 10.3 루씬닷넷(C#와 다른 닷넷 언어)
      • 10.3.1 API 호환성
      • 10.3.2 색인 호환성
    • 10.4 키노서치, 루씨(펄)
      • 10.4.1 키노서치
      • 10.4.2 루씨
      • 10.4.3 기타 펄 루씬 프로젝트
    • 10.5 페렛(루비)
    • 10.6 PHP
      • 10.6.1 Zend 프레임워크
      • 10.6.2 PHP Bridge
    • 10.7 파이루씬(파이썬)
      • 10.7.1 API 호환성
      • 10.7.2 기타 파이썬 루씬 프로젝트
    • 10.8 솔라(다양한 프로그래밍 언어)
    • 10.9 정리
  • 11장 루씬 관리와 성능 튜닝
    • 11.1 성능 최적화
      • 11.1.1 간단한 최적화 방법
      • 11.1.2 성능 측정
      • 11.1.3 색인 후 검색까지 걸리는 시간 최적화
      • 11.1.4 색인 속도 최적화
      • 11.1.5 검색 처리량과 대기 시간 최적화
    • 11.2 스레드와 병렬 처리
      • 11.2.1 병렬 색인
      • 11.2.2 병렬 검색
    • 11.3 자원 관리
      • 11.3.1 디스크
      • 11.3.2 파일 식별자
      • 11.3.3 메모리
    • 11.4 색인 백업
      • 11.4.1 백업
      • 11.4.2 복원
    • 11.5 일반적인 오류
      • 11.5.1 깨진 색인
      • 11.5.2 색인 수리
    • 11.6 정리
  • 3부 사례 연구
  • 12장 사례 연구 1: 크루글
    • 12.1 크루글 소개
    • 12.2 장비의 구조
    • 12.3 검색 성능
    • 12.4 소스코드 해석
    • 12.5 부분 문자열 검색
    • 12.6 질의, 검색
    • 12.7 개선 방안
      • 12.7.1 필드 캐시 메모리 사용량
      • 12.7.2 색인 통합
    • 12.8 정리
  • 13장 사례 연구 2: SIREn
    • 13.1 소개
    • 13.2 효과
      • 13.2.1 모든 필드를 검색
      • 13.2.2 효율적인 단일 어휘
      • 13.2.3 유연한 필드
    • 13.3 SIREn으로 엔티티 색인
      • 13.3.1 데이터 모델
      • 13.3.2 구현 관련 문제
      • 13.3.3 색인 스키마
      • 13.3.4 색인 전 데이터 준비
    • 13.4 엔티티 검색
      • 13.4.1 내용 검색
      • 13.4.2 셀 내부 검색
      • 13.4.3 셀을 튜플로 묶음
      • 13.4.4 엔티티 설명 질의
    • 13.5 SIREn과 솔라 연동
    • 13.6 성능 측정
    • 13.7 정리
  • 14장 사례 연구 3: 링크드인
    • 14.1 보보 브라우즈와 다면 검색
      • 14.1.1 보보 브라우즈 설계
      • 14.1.2 고급 기능 활용
    • 14.2 조이 실시간 검색
      • 14.2.1 조이 시스템 구조
      • 14.2.2 실시간과 준실시간
      • 14.2.3 문서와 색인 요청
      • 14.2.4 IndexReader 직접 작성
      • 14.2.5 루씬의 준실시간 검색과 비교
      • 14.2.6 분산 검색
    • 14.3 정리
  • 부록
  • 부록 A 루씬 설치
  • 부록 B 루씬 색인 구조
  • 부록 C 루씬 성능 측정

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

[ p51 아래에서 5행 ]
필요한 독자는 참고하기 바란라. → 필요한 독자는 참고하기 바란다.

[ p95 소스코드 ]
⑧ IndexSearcher 닫기삭제
is.close(); → ⑨ IndexSearcher 닫기