lucene 검색이 어떻게 그렇게 빠르게 작동하는지 알고 싶습니다. 웹에서 유용한 문서를 찾을 수 없습니다. 읽을 것이 있으면 (lucene 소스 코드가 부족한 경우) 알려주십시오.
색인이있는 mysql5 텍스트 검색을 사용하는 텍스트 검색 쿼리는 필자의 경우 약 18 분이 걸립니다. 동일한 쿼리에 대한 lucene 검색은 1 초도 채 걸리지 않습니다.
답변:
Lucene은 반전 된 전체 텍스트 인덱스입니다. 즉, 모든 문서를 가져 와서 단어로 분할 한 다음 각 단어에 대한 색인 을 만듭니다 . 인덱스는 순서가없는 정확한 문자열 일치이기 때문에 매우 빠를 수 있습니다. 가설 적으로 varchar
필드 에 대한 SQL 비 정렬 인덱스는 그만큼 빠를 수 있으며, 실제로 큰 데이터베이스가이 경우 간단한 문자열 같음 쿼리를 매우 빠르게 수행 할 수 있다는 것을 알게 될 것입니다.
Lucene은 트랜잭션 처리를 위해 최적화 할 필요가 없습니다. 문서를 추가 할 때 쿼리에서 문서가 즉시 표시되도록 할 필요는 없습니다 . 또한 기존 문서에 대한 업데이트를 최적화 할 필요가 없습니다.
그러나 하루가 끝날 때 정말로 알고 싶다면 소스를 읽어야합니다. 당신이 참조하는 두 가지는 결국 오픈 소스입니다.
Lucene은 큰 인덱스를 만듭니다. 색인에는 단어 ID, 단어가있는 문서 수 및 해당 문서에서 단어의 위치가 포함됩니다. 따라서 단일 단어 쿼리를 제공하면 인덱스 만 검색합니다 (O (1) 시간 복잡도). 그런 다음 결과는 다른 알고리즘을 사용하여 순위가 매겨집니다. 다중 단어 쿼리의 경우 단어가있는 파일 세트의 교차점을 취하십시오. 따라서 Lucene은 매우 빠릅니다.
자세한 내용은 Google 개발자가 작성한이 기사를 읽으십시오. http://infolab.stanford.edu/~backrub/google.html
한마디로 : 인덱싱.
Lucene은 훨씬 더 빠르게 검색 할 수 있도록 문서의 색인을 만듭니다.
목록 O (N) 데이터 구조와 해시 테이블 O (1) 데이터 구조의 차이는 동일합니다. 목록은 원하는 것을 찾기 위해 전체 컬렉션을 살펴 봐야합니다. 해시 테이블에는 원하는 항목이 정확히 어디에 있는지 파악하고 간단히 가져올 수있는 인덱스가 있습니다.
최신 정보:
"Lucene 인덱스 검색이 mysql 인덱스 검색보다 훨씬 빠릅니다."라는 말이 무슨 뜻인지 잘 모르겠습니다.
내 생각 엔 MySQL "WHERE document LIKE '% phrase %'"를 사용하여 문서를 검색하고있는 것 같습니다. 이것이 사실이라면 MySQL은 모든 행에 대해 테이블 스캔을 수행해야하며 이는 O (N)이됩니다.
Lucene은 문서를 토큰으로 구문 분석하고 사용자의 지시에 따라 n-gram으로 그룹화하고 각각의 인덱스를 계산합니다. 색인화 된 Lucene 문서에서 단어를 찾는 것은 O (1)입니다.
Lucene은 용어 빈도 및 역 문서 빈도로 작동합니다 . 그것은 문서와 각 단어를 매핑하는 색인을 생성하고 문서에서 역 색인에 불과한 빈도 수입니다.
예 :
파일 1 : 랜덤 액세스 메모리가 주 메모리입니다.
파일 2 : 하드 디스크는 보조 메모리입니다.
Lucene은 다음과 같은 역 색인을 만듭니다.
파일 1 :
기간 : 무작위
주파수 : 1
위치 : 0
기간 : 기억
주파수 : 2
위치 : 3
위치 : 6
따라서 검색된 콘텐츠를 빠르게 검색하고 검색 할 수 있습니다. 검색어와 일치하는 항목이 너무 많으면 가중치에 따라 결과를 출력합니다. 검색어 고려 "Main Memory"를 4 개의 단어를 모두 개별적으로 검색하면 결과는 다음과 같습니다.
본관
파일 1 : 빈도-1
기억
파일 1 : 주파수-2
파일 2 : 주파수-1
결과는 File1 다음에 File2 입니다. 'and', 'or', 'the'와 같은 가장 일반적인 단어에 대한 가중치에 휩쓸 리지 않기 위해 역 문서 빈도를 고려합니다 (즉, 문서 집합 중에서 가장 인기있는 단어의 가중치를 줄입니다).