스핑크스 검색 엔진으로 색인을 생성하려는 데이터베이스가 있습니다. 문제는 Sphinx가 각 문서에 대해 정수 ID를 요구하지만 데이터베이스에 기본 키로 GUID (실제로는 임의의 GUID 유사 문자열)가 있다는 것입니다. 난 as described in this recipe 비행에 합성 ID를 생성 할 수 있지만 그것은 전체 인덱스에만 좋습니다. 증분 인덱스 또는 런타임 인덱스를 갖고 싶다면 어떻게해야합니까? 증분 인덱스 및 런타임 인덱스와 함께 사용할 수있는 Sphinx를 사용하여 GUID를 처리하는 모범 사례가 있습니까? 문제의 데이터베이스는 꽤 클 것이므로 자주 다시 인덱스하고 싶지는 않습니다.스핑크스 및 GUID
1
A
답변
9
실시간 인덱스 : 당신은 숫자 값에 숫자가 아닌 GUID를 변환 할 수 있습니다이 같은 (당신은 숫자로 캐스트 CRC32 또는 MD5 사용할 수 있습니다) :
mysql> select conv(mid(md5('abc'), 1, 16), 16, 10);
+--------------------------------------+
| conv(mid(md5('abc'), 1, 16), 16, 10) |
+--------------------------------------+
| 10376663631224000432 |
+--------------------------------------+
1 row in set (0.00 sec)
테스트를하거나 그림을 구글 어떤 알고리즘이 충돌을 덜 줄 것인가.
숫자 ID를 받으면 Sphinx RT 색인에 문서를 INSERT 할 수 있습니다.
증분 인덱스 : 위에서 설명한 것과 같은 방법을 사용하여 GUID를 숫자로 변환 할 수 있지만 인덱스의 주요 부분이 델타 빌드를 완료 한 곳을 기억해야합니다. 테이블에 "업데이트 됨"또는 "삽입 됨"필드가 있으면 쉽게 수행 할 수 있습니다. sql_query_range는 "select ... where where updated> (select last_updated from sphinx_helper)"와 같을 것입니다. 이 경우 순차적이지 않으므로 ID를 기반으로 할 수 없습니다.
내가 11.8M 다른 도메인에 MD5 너 한테의 절반을 테스트했습니다
mysql> update domain_tmp set hash = conv(mid(md5(domain), 1, 16), 16, 10);
Query OK, 5901483 rows affected (1 min 59.03 sec)
Rows matched: 11800403 Changed: 5901483 Warnings: 0
mysql> select count(*) from domain_tmp;
+----------+
| count(*) |
+----------+
| 11800403 |
+----------+
1 row in set (16.30 sec)
mysql> select count(distinct hash) from domain_tmp;
+----------------------+
| count(distinct hash) |
+----------------------+
| 11800403 |
+----------------------+
1 row in set (1 min 5.51 sec)
즉 어떤 충돌이 발생하지 않습니다. 따라서 데이터 세트에 더 많은 문서가 없으면 md5의 절반을 사용하는 것이 좋습니다.
관련 문제
- 1. 스핑크스, xmlpipe2 및 cassandra
- 2. Subsonic3 및 GUID
- 3. SqlBulkInsert 및 GUID 문제
- 4. 순차적 GUID 및 단편화
- 5. UUID 및 GUID 문제
- 6. IQueryable, Where, Guid 및
- 7. 스핑크스 및 일대 다 연관
- 8. WP_Insert_Post 및 GUID 문제 [Wordpress]
- 9. 스핑크스 템플릿
- 10. 스핑크스 문서
- 11. 는 스핑크스
- 12. wordforms 스핑크스
- 13. GUID 생성
- 14. Nullable GUID
- 15. 스핑크스 SPH_MATCH_ALL, SPH_MATCH_PHRASE, SPH_MATCH_BOOLEAN, SPH_MATCH_ALL 및 SPH_MATCH_EXTENDED2?
- 16. 스핑크스 SPH_MATCH_ANY를 사용하여 SetFieldWeights 및 SetSortMode를 무시합니다.
- 17. 스핑크스 및 Thinking_Sphinx가있는 중첩 된 부분
- 18. SubSonic, GUID 및 MySQL Null 참조 예외
- 19. SIlverlight 4, FilterDescriptor 및 GUID with FilterOperator
- 20. ACT에서 연락처 및 회사 GUID 검색 중!
- 21. Unix 및 Windows 용 명령 줄 GUID?
- 22. 스핑크스 검색 문제
- 23. C에서 간단한 GUID 생성
- 24. SQL : guid 저장
- 25. 스핑크스 + tokyo Tyrant + mysql
- 26. 스핑크스 색인 스키마 제안
- 27. 윅스의 GUID 구성 요소
- 28. ColdFusion에서 - 오라클의 GUID 이상한
- 29. 악센트가있는 스핑크스 주문
- 30. "평행선"을 쓰는 스핑크스
새로운 ID를 생성하기 위해 모든 테이블 구조를 변경할 수는 없습니다 (ORM과 유사한 시스템에서 생성 된 테이블 구조의 테이블이 50 개 이상 있습니다). 아마도 md5 방법을 사용할 수 있습니다 ...하지만 충돌에 대해 걱정하고 있습니다. – StasM
테이블 구조를 변경할 필요가 없습니다. Sphinx 인덱서로 SELECT를하면 새 ID를 즉시 생성 할 수 있습니다. 충돌에 관해서 - md5의 절반은 꽤 괜찮아 보입니다. 나는 11.8M의 다른 영역에서 충돌을 테스트했습니다. 충돌은 없습니다. –