2

MongoDB를 가지고 놀면서 멋진 기능을 확인하고 있습니다. 게시물, 작성자 및 주석이 포함 된 간단한 블로그 시스템을 나타내는 작은 테스트 슈트를 작성했습니다.MongoDB에서의 전체 텍스트 검색 및 역 색인

MongoRegEx 클래스 (PHP 드라이버)를 사용하는 검색 기능을 사용해 보았습니다. 여기서는 "/ l"에 대소 문자를 구분하여 'lorem ipsum'문장 뒤에 모든 게시물 내용과 게시물 제목을 검색하고 있습니다. .

$regex = new MongoRegEx('/lorem ipsum/i'); 
$query = array('post' => $regex, 'post_title' => $regex); 

하지만 혼란 스러워요 무슨 일이 일어나는지에 대해 기절 :

내 코드는 다음과 같습니다. 나는 실행 시간에 대한 모든 쿼리를 확인한다. (질의 전후에 마이크로 시간을 설정하고 15 개의 십진수로 시간을 얻는다.)

첫 번째 테스트에서는 모든 블로그가 무작위로 생성 된 110,000 개의 블로그 문서와 5000 명의 작성자를 추가했습니다. 검색을 할 때 "lorem ipsum"이라는 문장으로 6824 개의 게시물을 찾고 검색을 수행하는 데 0.000057935714722 초가 걸립니다. 그리고 이것은 이후입니다. (Windows를 사용하여) MongoDB 서비스를 재설정했고 이것은 _id의 기본값 이외의 다른 색인이 아닙니다.

MongoDB는 B-tree 색인을 사용합니다. B-tree 색인은 전체 텍스트 검색에 매우 효율적이지 않습니다. 게시물 콘텐츠 속성에 색인을 만들면 위 쿼리와 동일한 쿼리가 0.000150918960571에서 실행됩니다. 이는 재미없는 색인이없는 것보다 느립니다 (0.000092983245849 요소가 더 느림). 이제 B- 트리 커서를 사용하기 때문에 여러 가지 이유가있을 수 있습니다.

하지만 어떻게 빨리 쿼리 할 수 ​​있는지에 대한 설명을 찾으려고했습니다. 아마도 RAM에 모든 것을 유지할 것입니다 (4GB가 있고 데이터베이스는 약 500MB입니다). 이것이 전체 결과를 얻기 위해 mongodb 서비스를 다시 시작하려고하는 이유입니다.

MongoDB를 사용 해본 경험이있는 사람이라면 색인의 유무에 관계없이 역 색인을 사용하지 않고 이런 종류의 전체 텍스트 검색을 진행할 수 있습니까?

감사 - Mestika

+0

표시되지 않은 경우 : http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo –

+1

mongodb regex는 "시작"유형 정규식이 아니면 색인을 사용하지 않습니다. - 나는 모든 용어를 배열로 분해하고 그것에 대한 색인을 작성하는 데 약간의 성공을 거뒀습니다. 그 솔루션을 Elastic Search (전체 텍스트 검색 부분)로 마이그레이션하면서 다른 유형의 쿼리를 위해 모든 것을 mongo에 보관할 계획입니다. 예, 액세스 할 수 있고 여유 메모리가있는 경우 RAM에 데이터를 보관합니다. –

답변

4

난 당신이 단순히 결과를 반복하지 않았다 생각? find()를 사용하면 드라이버는 이 아니며은 서버에 쿼리를 보냅니다. 적어도 하나의 결과를 가져와야합니다. 나는 MongoDB가 이렇게 빠르다는 것을 믿지 않으며, 나는 당신의 오류가 당신의 벤치 마크에 있다고 믿습니다.

두 번째로 이 아닌이 아닌 ^ 인 필드 값의 시작 부분에 앵커 된 정규식 검색의 경우 색인이 전혀 사용되지 않습니다. 실제로 일어나고있는 것을 보려면 explain()으로해야합니다.