2011-01-13 5 views
3

이것은 일반적인 Java 문제로 간주 될 수 있지만 이해를 돕기 위해 Lucene을 예제로 사용하고 있습니다.Lucene이 텍스트를 토큰으로 처리하는 프로세스

Lucene에서 다른 토큰 화 도구를 사용하여 텍스트를 토큰화할 수 있습니다. 주요 추상 Tokenizer 클래스가 있고 그 클래스를 확장하는 여러 클래스가 있습니다. TokenFilter에 대해서도 마찬가지입니다.

이제 문서를 색인 할 때마다 새로운 Tokenizer가 만들어집니다. 질문은, Tokeinzer가 단지 유틸리티 클래스 일 뿐이므로, 정적으로 만들지 않겠습니까? 예를 들어, 모든 문자를 소문자로 변환하는 Tokenizer는 가져 오는 모든 입력에 대해이를 수행하는 정적 메서드를 가질 수 있습니다. 색인을 생성하려는 모든 텍스트 부분에 대해 새 개체를 만드는 것은 무엇입니까?

Tokeinzer에는 토큰화할 입력을 포함하는 개인 필드가 있습니다. 토큰 화 프로세스가 끝나고 새 토큰 화 된 텍스트가 반환 된 직후 개체가 파괴되므로이 방법으로 저장해야하는 이유는 알 수 없습니다. 내가 생각할 수있는 유일한 것은 멀티 스레드 액세스 일 것입니다.

감사합니다.

답변

6

이제, 당신이 색인에 문서를 할 때마다이 새로운 토큰 화는

이 사실이 아니라는을 만든 것으로 보인다는 Analyzer.reusableTokenStream 방법은 어떤 을하지 다시 사용,라고 Tokenizer뿐 아니라 전체 체인 (TokenFilters 등). Tokeinzer은 토큰 화하는 수신 입력을 포함하는 개인 필드가 -

한 가지 언급) http://lucene.apache.org/java/3_0_0/api/core/org/apache/lucene/analysis/Analyzer.html#reusableTokenStream(java.lang.String, java.io.Reader를 참조 . 토큰 화 프로세스가 끝나고 새 토큰 화 된 텍스트가 반환 된 직후 개체가 파괴되므로이 방법으로 저장해야하는 이유는 알 수 없습니다. 내가 생각할 수있는 유일한 것은 멀티 스레드 액세스 일 것입니다.

앞서 언급했듯이 전체 토큰 장치 및 토큰 필터는 문서 전체에서 재사용됩니다. 따라서 모든 속성이 재사용 될뿐 아니라 속성이 체인 전반에 걸쳐 공유된다는 점에 유의해야합니다 (예 : 모든 Tokenizers 및 TokenFilters의 속성 참조가 동일한 인스턴스를 가리킴). 따라서 tokenizer의 clearAttributes()를 호출하여 모든 속성을 재설정하는 것이 중요합니다.

예를 들어, 공백 토큰 화 프로그램은 해당 ctor의 TermAttribute에 대한 참조를 추가하고 LowerCaseFilter로 래핑하여 해당 Termator에 대한 참조를 추가합니다. 이 두 TermAttributes는 모두 동일한 기본 char []를 가리 킵니다. 새 문서가 처리되면 Analyzer.reusableTokenStream이 호출되어 이전 문서에서 사용한 것과 동일한 TokenStream 체인 (이 경우 LowerCaseFilter로 둘러 쌓인 공백)을 반환합니다. reset (Reader) 메서드가 호출되어 토크 나이저의 입력을 새 문서 내용으로 다시 설정합니다. 마지막으로 reset()이 전체 스트림에서 호출되어 이전 문서에서 내부 상태를 다시 설정하고 incrementToken()이 false를 반환 할 때까지 내용이 처리됩니다.

+0

고마워요. 이것은 지금 많은 의미가 있습니다. – user431336

0

Lucene이있는 문서를 인덱싱하는 것과 같은 복잡한 작업을 할 때 클래스의 인스턴스를 만드는 것에 대해 걱정하지 마십시오. 토큰 화 및 색인 생성 과정에서 많은 객체가 생성 될 것입니다. 프로세스가 완료 될 때 버려지는 객체에서 남은 쓰레기를 비교할 때 더 많은 토큰 화기 인스턴스는 아무 것도 아닙니다. 당신이 프로파일을 얻고 객체 생성 카운트를 보았다고 생각하지 않는다면.

관련 문제