당신이 필요의 자세한 내용을 모른 채, 당신은 아마 다음 중 하나를 수행합니다 :
스핑크스 설치 및 구성과 관련된 내용을 완전히 알지 못합니다. 그러나 나는 데이터베이스에서 지적하고 색인을 생성 할 필드, 결과 가중치를 부여하는 방법을 알려주고 일치하는 레코드의 순서 목록을 제공합니다.
사용자가 직면하거나 미션 크리티컬 한 물건을 사용하려면 기존 검색 도구를 사용하십시오.
당신이 학업을 느끼고 있다면 ... ngrams와 함께 플레이 :
ngrams 조회 테이블은 잠재적 인 일치 항목의 초기 세트 역할을 할 수 있으며 Levenshtein 거리를 사용하여 결과를 정리하고 정렬 할 수 있습니다.
검색하고 싶다고 가정하면 people
다음과 같이 할 수 있습니다.
_ people _________
personId: int
name: varchar
soundex_name: varchar
_ people_ngrams __
personId: int
ngramId: int
_ ngrams _________
ngramId: int
ngram: char(3)
count: int
ngram을 주기적으로 재 구축하거나 즉석에서 구축 할 수 있습니다. 어느 쪽이든 단순하고 순진한 검색 알고리즘은 다음과 같습니다.
search_ngrams = ngrammify(soundex(search_string));
notable_ngrams = select top 10 *
from ngrams
where ngram in (search_ngrams)
order by count asc;
possible_matches = select top 1000 distinct people.*
from people_ngrams, people
where ngramId in (notable_ngrams);
best_matches = top 100 possible_matches
ordered by Levenshtein_distance(match, soundex(search_string));
이와 비슷한 것을 사용 하지만 (ngram "인기"튜닝, 블랙리스트, 화이트리스트 등), 나는 이런 종류의 알고리즘이 데이터 세트 사이에서 레코드를 대량으로 병합하고 사용자 정의 퍼지 검색을 용이하게하는 것을 보았습니다. 유틸리티 및 지속적인 기록 중복 제거 노력.
이제 필자의 경우 수백만 개의 레코드와 일치하지 않았기 때문에 각 데이터 수십만 개의 레코드 순서로 두 데이터 세트간에 가능한 최상의 병합을 선택하려고했습니다. 그리고 몇 분 안에 상당히 빠르게 작동하기를 원했습니다. (빠른, 100,000 * 100,000은 무엇입니까?) 그리고 우리는 성공했습니다.
따라서 올바른 조정을 사용하면 이러한 종류의 작업이 매우 빠르고 효과적 일 수 있습니다. 우리는 궁극적으로 몇 분 안에 겸손하고 날짜가 적힌 듀얼 코어 머신에서 병합 된 세트를 생성 할 수 있었으며, 수동으로 검토 할 수 있도록 "질문이있는"병합이 자동으로 표시되었습니다. 그러나 ngram 인기 / 관련 스위트 스팟, 올바른 문자열 거리 임계 값, 블랙리스트 및 화이트리스트 등을 찾는 데 많은 시간이 걸렸습니다.
말했듯이 , 당신은 실제로이 물건들에서 일하는 구멍 에 빠질 수 있습니다. 실제 프로덕션 수준의 자료에는 일반적으로 이러한 종류의 검색에 맞게 이미 만들어 지고 최적화 된 잘 구축 된 도구를 사용해야합니다 .
스핑크스 또는 루신 처럼 .