Lucene은 어떻게 작동합니까?


90

lucene 검색이 어떻게 그렇게 빠르게 작동하는지 알고 싶습니다. 웹에서 유용한 문서를 찾을 수 없습니다. 읽을 것이 있으면 (lucene 소스 코드가 부족한 경우) 알려주십시오.

색인이있는 mysql5 텍스트 검색을 사용하는 텍스트 검색 쿼리는 필자의 경우 약 18 분이 걸립니다. 동일한 쿼리에 대한 lucene 검색은 1 초도 채 걸리지 않습니다.


2
이 질문을 커뮤니티 위키로 변환하도록 요청할 수 있습니까? Lucene은 이제 플랫폼처럼 들립니다.
asyncwait

답변:


75

Lucene은 반전 된 전체 텍스트 인덱스입니다. 즉, 모든 문서를 가져 와서 단어로 분할 한 다음 각 단어에 대한 색인 만듭니다 . 인덱스는 순서가없는 정확한 문자열 일치이기 때문에 매우 빠를 수 있습니다. 가설 적으로 varchar필드 에 대한 SQL 비 정렬 인덱스는 그만큼 빠를 수 있으며, 실제로 큰 데이터베이스가이 경우 간단한 문자열 같음 쿼리를 매우 빠르게 수행 할 수 있다는 것을 알게 될 것입니다.

Lucene은 트랜잭션 처리를 위해 최적화 할 필요가 없습니다. 문서를 추가 할 때 쿼리에서 문서가 즉시 표시되도록 할 필요는 없습니다 . 또한 기존 문서에 대한 업데이트를 최적화 할 필요가 없습니다.

그러나 하루가 끝날 때 정말로 알고 싶다면 소스를 읽어야합니다. 당신이 참조하는 두 가지는 결국 오픈 소스입니다.


내가 올바르게 이해한다면 텍스트 검색 엔진을 차별화하는 것은 그들이 여러 단어 검색을 처리하고 검색 결과를 실시간으로 여러 색인에 결합하는 방법입니다. 나는 이것에 대해 Lucene 소스에 컨설팅을 제안하지 않을 것입니다. 텍스트 검색 이론에 대해 조금 읽는 것이 좋을 것입니다. @ alienCoder의 답변이 도움이되었습니다.
Chris Dutrow 2014

1
@bmargulies, 인덱싱이 "단어 당"인 경우 stackoverflow 사용자 검색 stackoverflow.com/users 가 하위 문자열 일치를 허용 하는 이유는 무엇입니까?
Pacerier

2
이것은 전체 책 답변을위한 곳이 아닙니다. 거기에 기본 개념에 대한 많은 정교함이 있습니다.
bmargulies

"각 단어에 대한 색인"이란 무엇을 의미합니까? "abc"를 입력하기 시작하면 문서에서 "abc"를 어떻게 찾을 수 있습니까?
Alexander Mills

1
단어에서 문서로의 색인 (B- 트리)은 색인이 단어 열에있는 (단어, 문서) 테이블이기 때문에 문서에서 단어별로 문서를 검색 할 수 있습니다. '경찰', '범죄', '통계'라는 단어가 포함 된 문서를 찾습니다. 단어 인덱스를 검색하면 3 개의 log (N) 검색을 수행하여 해당 단어 중 하나가 포함 된 O (N) 문서를 얻을 수 있습니다. 그런 다음 두 개의 O (N) 루프를 수행하여 세 단어가 모두 포함 된 문서를 포함하는 집합을 만들 수 있습니다. 이론적으로는 O (N) 연산이지만 대부분의 문서에는 세 단어가 모두 포함되어 있지 않으므로 O (n) 여기서 n <N.
Calicoder

34

Lucene은 큰 인덱스를 만듭니다. 색인에는 단어 ID, 단어가있는 문서 수 및 해당 문서에서 단어의 위치가 포함됩니다. 따라서 단일 단어 쿼리를 제공하면 인덱스 만 검색합니다 (O (1) 시간 복잡도). 그런 다음 결과는 다른 알고리즘을 사용하여 순위가 매겨집니다. 다중 단어 쿼리의 경우 단어가있는 파일 세트의 교차점을 취하십시오. 따라서 Lucene은 매우 빠릅니다.

자세한 내용은 Google 개발자가 작성한이 기사를 읽으십시오. http://infolab.stanford.edu/~backrub/google.html


8
그 종이를 훑어 보았는데 꽤 도움이되었습니다. 구체적으로 "4.5 Searching"이 제가 찾고 있던 답이었습니다. 특히 O (1) 해시 검색이 개별 단어에 사용되는 것처럼 들리지만 O (n) 스캔을 사용하여 결과를 40,000 개 문서 제한으로 결합합니다. 사용자가 즉각적인 결과를 얻도록이 작업을 분할하는 데 map-reduce 알고리즘이 사용된다고 가정합니다.
Chris Dutrow 2014

널리 사용되는 알고리즘 중 하나는 비둘기 순위 알고리즘입니다. 나는 그것에 대해 많이 모르지만.
alienCoder

3
그 논문은 흥미 롭습니다. "이 논문에서는 프로토 타입 인 Google을 소개합니다 ...". Google이 항상 거대 기업이 아니었던 것 같습니다.
Buttons840

Lucene을 모르지만 한 가지 질문 : 각 검색에서 순위가 ​​발생합니까? 아니면 사전 순위가 매겨진 문서를 유지합니까? 사전에 계급별로 문서를 유지하면 여러 단어 쿼리에 대해 어떻게 유지합니까?
Vikas Prasad

이제 링크가 끊어졌습니다. @alienCoder
CEGRD

20

한마디로 : 인덱싱.

Lucene은 훨씬 더 빠르게 검색 할 수 있도록 문서의 색인을 만듭니다.

목록 O (N) 데이터 구조와 해시 테이블 O (1) 데이터 구조의 차이는 동일합니다. 목록은 원하는 것을 찾기 위해 전체 컬렉션을 살펴 봐야합니다. 해시 테이블에는 원하는 항목이 정확히 어디에 있는지 파악하고 간단히 가져올 수있는 인덱스가 있습니다.

최신 정보:

"Lucene 인덱스 검색이 mysql 인덱스 검색보다 훨씬 빠릅니다."라는 말이 무슨 뜻인지 잘 모르겠습니다.

내 생각 엔 MySQL "WHERE document LIKE '% phrase %'"를 사용하여 문서를 검색하고있는 것 같습니다. 이것이 사실이라면 MySQL은 모든 행에 대해 테이블 ​​스캔을 수행해야하며 이는 O (N)이됩니다.

Lucene은 문서를 토큰으로 구문 분석하고 사용자의 지시에 따라 n-gram으로 그룹화하고 각각의 인덱스를 계산합니다. 색인화 된 Lucene 문서에서 단어를 찾는 것은 O (1)입니다.


10
예, 인덱싱 부분을 이해하지만 다시 말하지만 lucene 인덱스 검색은 mysql 인덱스 검색보다 훨씬 빠릅니다. 어떻게
그럴까요

8

Lucene은 용어 빈도 및 역 문서 빈도로 작동합니다 . 그것은 문서와 각 단어를 매핑하는 색인을 생성하고 문서에서 역 색인에 불과한 빈도 수입니다.

:

파일 1 : 랜덤 액세스 메모리가 주 메모리입니다.

파일 2 : 하드 디스크는 보조 메모리입니다.

Lucene은 다음과 같은 역 색인을 만듭니다.

파일 1 :

기간 : 무작위

주파수 : 1

위치 : 0

기간 : 기억

주파수 : 2

위치 : 3

위치 : 6

따라서 검색된 콘텐츠를 빠르게 검색하고 검색 할 수 있습니다. 검색어와 일치하는 항목이 너무 많으면 가중치에 따라 결과를 출력합니다. 검색어 고려 "Main Memory"를 4 개의 단어를 모두 개별적으로 검색하면 결과는 다음과 같습니다.

본관

파일 1 : 빈도-1

기억

파일 1 : 주파수-2

파일 2 : 주파수-1

결과는 File1 다음에 File2 입니다. 'and', 'or', 'the'와 같은 가장 일반적인 단어에 대한 가중치에 휩쓸 리지 않기 위해 역 문서 빈도를 고려합니다 (즉, 문서 집합 중에서 가장 인기있는 단어의 가중치를 줄입니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.