내가 (처음부터 작은 검색 엔진을 쓰기에 약간의 경험을 공유하기 위해이 질문을 사용합니다 어떤 검색 관련 라이브러리는 매우 작은 데이터 세트 (실제로는 단일 서버에서 작동하기에는 너무 작거나 너무 작지 않으므로 stackoverflow를 검색합니다)에 사용됩니다. Check it out. 아래 주제에 대한 나의 발견이있다.
크롤러가
첫째, 크롤러가 할 수있는 힘든 일이다. 진짜 문제는 당신이 웹 페이지를 얻는 것처럼 빨리 디스크에 데이터를 쓰는 것입니다. 주요 데이터 구조는 역 색인이므로 "바나나"라는 단어를 얻으면 디스크에서 "바나나"색인 (문서의 위치와 함께 문서 목록)을 가져와 새 레코드를 추가해야합니다 그것을 다시 써라. 목록이 커지면 당겨서 다시 쓰는 속도가 느려집니다. 따라서 한 가지 트릭은 역 색인 (및 문서)을 파티션으로 분할하는 것입니다 (첫 번째 파티션의 1-1000 문서 등). 다른 "트릭"은 파티션을 크롤링하여 메모리에 인덱스를 유지하고 파티션이 완료 될 때만 디스크로 플러시하는 것입니다.
중요 비트 : 데이터를 저장하기 위해 무엇을 사용해야합니까? 많은 옵션이 있으며, 많은 실험을 거친 후 leveldb가 오늘날 최고의 선택이되는 것으로 나타났습니다. 그리고 SSD 디스크도 잊지 마세요!
따라서 하나의 컴퓨터 (4GB RAM)를 사용하여 이러한 방식으로 대부분의 stackoverflow (~ 13 000 000 페이지)를 크롤링하는 데 약 2 개월이 소요됩니다. 결과 데이터 (역 색인, 원시 스트립 된 텍스트 등) - 약 80GB의 디스크 공간.
검색
목표는 빠르고 높은 품질로하는 것입니다. 한 가지 알아야 할 점은, 빠른 속도를 원하면 전체 데이터 세트를 검색 할 수 없다는 것입니다. 다행스럽게도 나는 모든 항목을 분할하여 키워드가 나타나는 첫 번째 100 개의 파티션 (별도의 인덱스)을 검색하고 "충분히 좋은"결과를 발견하면 중지하지 않으면 100을 더받습니다.
가장 느린 부분은 디스크에서 색인을 읽고 그것을 비 직렬화하는 것입니다.Leveldb는 빠른 순차 읽기를 지원하므로 데이터를 순차적으로 읽을 수있는 방식으로 저장해야합니다. 메모리 세트 교차점은 꽤 빠릅니다.
이제 품질. 그것은 가장 힘들고 결코 충분하지 않습니다. 필자의 초기 시도는 텍스트뿐 아니라 제목, 링크 텍스트 및 URL에 대한 역 색인도 유지하는 것이 었습니다. 이것들에있는 모든 히트는 문서에 몇 가지 포인트를 추가합니다. 또 다른 것은 동의어를 사용하여 쿼리를 수정하고 어떤 식으로 쿼리가 가장 잘 작동했는지 확인하는 것입니다. 아마 자기 소유의 게시물 일 가치가있을거야.
어쨌든, 나는 유용한 독서가되기를 바랍니다.
출처
2015-09-02 20:56:28
ren
고마워요! 나는 이것을 한 번 보았지만 그것이 있었던 곳을 잊어 버렸다. – davemackey