2011-02-04 4 views
4

2.000.000 메시지가있는 데이터베이스가 있습니다. 사용자가 메시지를받을 때 단어의 발생을 기반으로 데이터베이스에 관련 메시지를 찾아야합니다.가장 큰 데이터베이스에서 유사한 메시지를 찾는 방법

데이터베이스를 요약하기 위해 일괄 처리를 실행 해 보았습니다. 1 - 모든 메시지의 모든 단어 (a, the, for, for ... 제외)를 저장합니다. 2 - 모든 메시지와 거기에 포함 된 단어 사이의 연관성을 생성합니다.이 단어의 빈도를 메시지에 저장합니다.

메시지 수신시 : 1 - 2 - 데이터베이스에서 쿼리를 수행하여 일치하는 단어의 수로 정렬 된 메시지를 가져옵니다.

그러나 내 단어 기반과 유사한 메시지를 가져 오는 쿼리를 업데이트하는 프로세스는 매우 무겁고 느립니다. 단어 업데이트는 3000 바이트의 메시지에 대해 ~ 1.2111 초 동안 지속됩니다. 비슷한 메시지를 쿼리하는 데는 동일한 크기의 메시지가 ~ 9.8 초 동안 지속됩니다.

데이터베이스 조정이 이미 완료되었으며 코드가 올바르게 작동합니다.

더 나은 알고리즘이 필요합니다.

아이디어가 있으십니까?

+0

전체 텍스트 검색이 필요하지 않습니까? http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html – Mchl

+1

"Collective Intelligence"라는 책을 적극 추천합니다. http://www.amazon.com/Programming-Collective-Intelligence -building-Applications/dp/0596529325/ref = sr_1_1? ie = UTF8 & qid = 1296849440 & sr = 8-1. 파이썬 용으로 작성되었지만 다른 언어로 구현하는 이론은 많이 있습니다. 이 책의 맨 처음 장은 당신이하려고하는 것을 포함합니다 –

+0

방금 ​​주문을했습니다. –

답변

2

Apache Solr (http://lucene.apache.org/solr/) 설정 사용을 권장합니다. 수백만 개의 문서를 쉽게 설정하고 색인을 생성 할 수 있습니다. Solr은 필요한 모든 최적화 작업을 처리합니다 (오픈 소스이기는하지만 필요하다고 생각하면 조정할 수 있음).

그런 다음 사용 가능한 API를 사용하여 쿼리 할 수 ​​있습니다. Java API SolrJ (http://wiki.apache.org/solr/Solrj)를 선호합니다. 나는 일반적으로 결과가 1 초 이내에 반환되는 것을 봅니다.

Solr은 일반적으로 MySQL보다 텍스트 색인 생성 성능이 월등합니다.

+0

아파치 Solr을 사용하여 구현을 테스트합니다. –

1

유사성 검색은 여전히 ​​복잡한 분야이지만, MySQL 참조 서의 full text matching을 살펴볼 수 있습니다. 특히 복잡한 예가 있습니다.

일회성 작업을 실행하여 모든 현재 메시지에 대한 유사성 매트릭스를 작성한 다음 야간 배치를 실행하여 유사성 매트릭스에 새 메시지를 추가하는 것이 가능해야합니다.

+0

야간 배치로 유사성 matriz를 업데이트했습니다. 전체 텍스트 검색을 사용하여 구현의 벤치 마크를 수행 할 것입니다. 감사 –

관련 문제