2010-07-30 5 views
3

저는 Postgres를 사용하고 있습니다.인덱스가있는 데이터베이스에서 대/소문자를 구분하지 않는 검색입니까?

저는 데이터베이스에 URL 슬러그 용 열 URL이있는 Artices 테이블을 가지고 있습니다. 이것들은 "example.com/23323"이 아닌 "example.com/Funny_Thing_Happened_to_Me"으로 웹 사이트에 해당 테이블의 기사를 표시 할 수 있도록하기위한 것입니다. 이것은 구현하기에 충분했으며 기사 수가 늘어남에 따라 URL 슬러그의 표에 색인을 추가했습니다.

나는 대문자로 표시된 글자를 URL에 표시 할 수 있기를 원하지만 사용자가 입력하는 내용에 대소 문자를 구분하지 않도록하고 싶습니다. 또한 URL에 고유성을 적용하려고합니다. 대소 문자를 구분하지 않습니다.

대소 문자를 구분하지 않고 텍스트 열을 기반으로 신속하게 검색하고 대소 문자를 구분하지 않고 고유성을 적용하는 간단한 방법이 있습니까?

lower(url) =과 같은 검색을 시도했지만 Postgres가 색인을 전혀 사용하지 않기로 결정했습니다.

답변

7

functional index를 사용하여 그런 다음 citext 유형을 살펴보십시오. 그것은 모든 하위/상위 항목을 추상화하고 약간 더 성능이 좋습니다.

+0

감사합니다.이 방법이 좋습니다. 유일한 문제는 낮은 (URL)에 기존 충돌로 인해 색인을 직접 만들 수는 없지만 데이터를 수정하는 것 이외의 다른 방법은 볼 수 없습니다. –

+1

@williamjones : 성능 이점을 얻으려면 인덱스를 잠시 고유하지 않은 것으로 추가하십시오. 그런 다음 고유성을 수정하고 새 고유 인덱스를 만들고 이전 인덱스를 삭제하십시오. – rfusca

1
SELECT * FROM sometable WHERE textfield ILIKE 'value%'; 

이 정보는 찾고 계신 정보입니다. "대소 문자를 구분하지 않는 방식으로 고유성을 적용"한다는 것은 무엇을 의미합니까? 당신이 ") (아래의"에 충실하려는 경우

가 아니면이 : 당신은 8.4 중이며있는 contrib 모듈을 설치할 수있는 경우,

CREATE UNIQUE INDEX ix_test1 on articles (lower(url)); 

:

SELECT * FROM sometable WHERE UPPER(textfield) LIKE (UPPER('value') || '%'); 
관련 문제