나는 각각 6 ~ 7 단어 미만의 대다수가 5 개 미만인 문구가 많으며 (~ 수백만 개), "문구 일치 "합니다. 이것은 검색 엔진 마케팅 용어입니다. 본질적으로 A는 B가 A에 포함되어 있으면 B와 일치합니다. 지금은 db (포스트 그레스)에 저장되어 있으며 정규 표현식에 대한 참여를 수행하고 있습니다 ( this question 참조). 모든 기본적인 최적화 기법 (색인 생성 등)을 시도하고 제공된 제안을 시도한 후에도 천천히 실행됩니다.
더 쉬운 방법이 있나요? 나는 비 DB 해결책에 싫어하지 않다. 정규 표현식이 잔인하고 다른 해결책보다 오래 걸릴 것으로 생각하는 이유가 있습니까?문구가 서로 일치하는지 확인하기
답변
하위 문자열 일치를 수행하는 이상적인 알고리즘은 AhoCorsick입니다.
데이터베이스를 사용하려면 데이터를 읽어야하지만 더 순진한 방법과 비교해 볼 때 매우 빠릅니다.
는 문자열 매칭에 관련된 질문에 대한 here 참조 : 자바의 AhoCorsick 구현을위한
그리고 here :
어떤 구절이 다른 부분 집합인지 알아야하는 이유에 대해 좀 더 자세히 알아야합니다. 예를 들어 DB가 그런 식으로 만들어지는 것이 이상하게 보입니다. DB가 적절한 형식이 아니기 때문에 지금 작업을 수행해야하므로 DB 또는 DB가 작성되는 방식을 '수정'해야합니다.
이것은 데이터로 무엇을하고 있는지, 왜 그랬는지에 따라 크게 달라 지지만 과거에는 단일 단어와 단어 쌍으로 분류하고 리소스 또는 구문을 해당 단일/쌍으로 연결하는 것이 유용하다는 것을 알았습니다.
예를 들어 내가 수행 한 검색 구현하는 경우 :
소스 텍스트 :
Testing phrases to see
항목 :
- 테스트
- 테스트 문구
- 문구
- 문구 을
- 에
- 다른 문구 유사한 (부여에 포함되지 않음) 같은 방법으로 다른 문구를 분해 및 어구의 수를 세는 것 인 경우
볼을 참조하십시오 볼 수 그들 사이의 공통점.
"테스트 단계를 참조하십시오"를 사용하는 경우에도 여전히 일치하는 좋은 부작용이 있습니다. 개별 단어가 일치하기 때문입니다.하지만 순서가 다르기 때문에 쌍이 다를 수 있으므로 그것은 동시에 (연속적인 단어들)을 고려하여, 매치의 수는 매칭에서 '스코어'로 사용하기에 좋지 않을 것입니다.
내가 말한 것처럼, - 어떤 것이 나에게 효과적 이었지만 더 많은 배경/컨텍스트를 듣는 것이 좋을 것이므로 더 나은 해결책을 찾을 수 있는지 알 수 있습니다.
MaasSQL의 이전 답변에서 '정리 된 열'을 사용하면 "구문 일치"가 정확히 작동하는 방식에 따라 포함 된 문자열의 길이에 따라이 열을 정렬 할 수 있습니다.
그런 다음 플랫 쿼리 대신 프로 시저에서 비교 쿼리를 실행하고 WHERE 문을 통해 비교할 후보를 제거하고 이미있는 후보를 삭제하는 방법으로 확인하십시오 테스트를 마쳤습니다. 이 작업을 수행하려면 임시 테이블이 필요할 수 있습니다.
이전에 'WHERE'문은 무엇을 의미합니까? 비교 값이 길이에 따라 정렬 된 열에 있으면 짧은 문자열 내에서 긴 문자열이 일치하는지 테스트 할 필요가 없습니다.
후보를 삭제할 때 : 가장 짧은 문자열부터 시작하여 특정 길이의 모든 문자열을 테스트 한 후에는 비교 테이블에서 해당 문자열을 제거 할 수 있습니다. 다음 테스트에서는 시합.
물론 하나의 SQL 문을 프로그래밍하는 것보다 더 많은 프로그래밍이 필요합니다. 그리고 "phrase match"가 정확하게 작동하는 방식에 의존합니다.
DTS 또는 SSIS도 여기에 친구가 될 수 있습니다.
- 1. 서로 다른 두 테이블의 두 열이 정확히 일치하는지 확인합니다.
- 2. 저장된 키워드/문구가 텍스트와 일치합니다.
- 3. 외부 ASCII 문자열과 일치하는지 확인하기 위해 저 장하지 않고 열을 ASCII로 ASCII로 변환하려면 어떻게해야합니까?
- 4. 리퍼러 확인하기
- 5. Google 도서의 인기 문구가 어떻게 개발 되었습니까?
- 6. MySQL 쿼리는 중요하고 일치하는지 검사합니다.
- 7. 조합이 주어진 세트와 일치하는지 확인하십시오.
- 8. NHibernate Criteria의 내용 확인하기
- 9. 특정 버전의 Angstrom 확인하기
- 10. NDBUnit으로 NHibernate 매핑 확인하기
- 11. hgrc 파일을 Mercurial로 확인하기
- 12. WP7에서 지퍼 서명 확인하기
- 13. JSP에서 요청 속성 확인하기
- 14. REL로 HTML 5 확인하기
- 15. TortoiseHG에서 커밋 메시지 확인하기
- 16. jQuery를 사용하여 정규식 확인하기
- 17. PHP에서 반복되는 문자 확인하기
- 18. 자바에 값이 있는지 확인하기
- 19. OpenGL 리소스 누수 확인하기
- 20. CodeIgniter의 뷰에서 세션 확인하기
- 21. 스트림을 킬로바이트로 확인하기
- 22. CakePHP에서 모델 관계 확인하기
- 23. cin으로 입력 "0"확인하기
- 24. 입력이 STEAM ID 형식과 일치하는지 확인하십시오.
- 25. 파일 mime-type이 PHP의 확장자와 일치하는지 확인하십시오
- 26. 등록 양식 두 암호가 일치하는지 확인
- 27. 이 두 배열을 비교하여 일치하는지 확인하는 방법
- 28. E4X 표현이 일치하는지 어떻게 알 수 있습니까?
- 29. 부분 문자열이 정규식과 일치하는지 어떻게 확인합니까?
- 30. jQuery - 선택기가 어떤 것과도 일치하는지 테스트하는 방법?
당신이 더 자세히 "A가 B에 포함되어있는"무엇을 의미합니까 설명 할 수 있습니까? 정확한 문자열 또는 개별 단어를 의미합니까? –
나는 당신의 링크 된 게시물을 보았다. A에 얼마나 많은 기록이 있고 B에 얼마나 많은 기록이 있습니까? –
찾고 계신 답변을 받으셨습니까? 그렇다면 그것을 받아 들일 수 있습니까? 그렇지 않다면, 당신이 찾고있는 것을 명확히 할 수 있습니까? 일반적으로 제공하는 정보가 많을수록 누군가가 당신을 도울 가능성이 커집니다. – MaasSql