문제

사용자를위한 검색 옵션을 제공하고 있습니다. 그들은 도시 이름으로 검색 할 수 있습니다. 문제는 내가 저장 한 도시 이름이 "세인트 루이스"와 같은 것입니다. 그러나 사용자가 "세인트 루이스"또는 "세인트 루이스"에있는 경우에도 세인트 루이스를 찾고 싶습니다. 어떻게 든 조회 테이블을 만들 수있는 방법에 대한 제안이 있습니까?

도움이 되었습니까?

해결책

만들다 테이블.

하나는 도시에 관한 모든 것을 포함합니다.

하나는 도시에 대한 많은 이름과 첫 번째 테이블의 ID와 NAES의 외국 키 협회가 포함되어 있습니다. 그래서 당신은 City와 City_names 사이에 하나에서 많은 관계가 있습니다.

이제 유일한 문제는 각 도시마다 하나의 이름을 선호하는 이름입니다. 우리는 다음과 같은 몇 가지 방법을 수행 할 수 있습니다. 1) 첫 번째 테이블은 두 번째 테이블에 FK를 가질 수 있습니다. 그러나 이것은 원형 의존성을 만듭니다. 2) 두 번째 테이블에 부울/비트 열을 추가하는 것입니다. is_preffered.

create table city (id not null primary key, other columns ) ;

create table city_name (
 id not null primary key, 
 city_id int references city(id), 
 name varchar(80),
 is_preferred bool  
) ;

그런 다음 선호하는 이름으로 모든 이름을 얻으려면 다음을 먼저하십시오.

   select name from city_names where city_id = ? 
   order by is_preffered desc, name;

여기에는 추가 이점이 있습니다. 모든 도시와 마을을 덮지 않으면 두 번째 테이블을 사용하여 마을/마을/카운티를지도 할 수 있습니다.

 insert into city_name(city_id, name) values
 ( $id-for-New-York-City, 'New York'),
 ( $id-for-New-York-City, 'Manhattan'),
 ( $id-for-New-York-City, 'Big Apple'),
 ( $id-for-New-York-City, 'Brooklyn');

다른 팁

내가 할 일은, 기본 테이블에서 사용할 단일 일관된 철자에 모호한 단어를 매핑하는 속기-정상 테이블을 만들 것입니다. 일반적인 철자 실수와 오타를 포함시킬 수 있습니다.

사용자의 요청을 찾기 전에이 테이블을 사용하여 모든 단어를 일반 양식으로 변환하십시오.

그래서 당신의 경우 shorthand-to-normal 우리가 가질 테이블

 ______________
| short|normal |
|______|_______|
|St    |Saint  |
|St.   |Saint  |

당신은 더 완전한 기능을 갖춘 전체 텍스트 검색 엔진을 살펴보고 싶을 수도 있습니다. Apache Lucene/Solr 또는 스핑크스 - 이런 종류의 문자열 매핑을 기본적으로 지원할 수 있습니다.

나는 이것을 다루는 여러 가지 가능한 방법을 봅니다. 하나는 a입니다 Soundex 영어 문자열의 유사성과 일치하는 조회 알고리즘. 또한 이것은 다음과 같은 일부 데이터베이스에서 기본적으로 지원됩니다. PostgreSQL.

또 다른 방법은 단순히 사용자에게 여러 가지 제안을 입력 할 때 자동 완성 기능을 제공하는 것일 수 있습니다. 이런 식으로 사용자는 원하는 조회 도시 이름을 직관적으로 선택합니다.

일반적인 접근 방식으로, 삽입 할 때와 검색 할 때 품목을 정규화 할 수 있습니다.

정규화 규칙은 다음과 같습니다.

Saint => St
St. => St

등.

그런 다음 정규화 된 이름이 일치해야합니다.

IMHO 나는 데이터베이스를 내버려두고 대신 응용 프로그램에 도시의 다운 다운 목록이 있습니다. 더 쉽고 깨끗하며 추가가 필요하지 않습니다.

첫 번째 답변에서 옵션이 마음에 듭니다.

또 다른 생각은 사용자가 Coudl 업데이트하는 해당 도시의 태그에 대한 열을 갖는 것입니다.

뉴욕시는 공식 이름입니다.

이 도시의 태그는 숫자가 될 것입니다 (Manhattan, NY, NYC, The City, Big Apple ..) 등은 주요 도시 테이블에서 그 쓰레기를 모두 원하지 않을 것입니다. 따라서 열에 집어 넣고 검색어에 따라 검색 한 다음 찾은 경우 올바른 이름을 반환하십시오.

시소러스 항목에는 내장 된 SQL FTS 속성을 사용할 수 있습니다. 이를 통해 전체 텍스트 검색 내부에서 사용자 정의 단어 맵을 벌릴 수 있습니다. 이렇게하면 FTS와 다른 쿼리를 혼합하지 않고 FTS 내부의 모든 것을 유지할 수 있습니다.

2005/8 사이에 다른 버전의 SQL을 사용하는 버전은 확실하지 않으므로 2005 / 8에 대한 좋은 연습이 있습니다. http://arcanecode.com/2008/05/28/creating-custom-thesaurus-entries-in-sql-server-2005-2008-full-text-search/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top