복붙노트

[SQL] 어떻게에만 PostgreSQL을 간단한 퍼지 검색을 만드는 방법?

SQL

어떻게에만 PostgreSQL을 간단한 퍼지 검색을 만드는 방법?

내 RoR에 기반 사이트의 검색 기능을 가진 약간의 문제가 있습니다. 나는 몇 가지 코드로 많은의 produts 있습니다. 이 코드는 "AB-123-lHdfj"와 같은 문자열이 될 수 있습니다. 지금은 제품을 찾을 수 ILIKE 연산자를 사용 :

Product.where("code ILIKE ?", "%" + params[:search] + "%")

그것은 잘 작동하지만, "AB123lHdfj"또는 "AB123lHdfj"와 같은 코드로 제품을 찾을 수 없습니다.

나는이 무엇을해야합니까? PostgreSQL의 일부 문자열 정규화 기능, 또는 다른 방법을 도와왔다 될 수 있습니까? :)

해결법

  1. ==============================

    1.포스트 그레스는 사운 덱스 및 메타 폰 등 여러 가지 문자열 비교 기능을 가진 모듈을 제공합니다. 하지만 당신은 levenshtein 편집 거리 함수를 사용하는 것이 좋습니다.

    포스트 그레스는 사운 덱스 및 메타 폰 등 여러 가지 문자열 비교 기능을 가진 모듈을 제공합니다. 하지만 당신은 levenshtein 편집 거리 함수를 사용하는 것이 좋습니다.

    Example:
    
    test=# SELECT levenshtein('GUMBO', 'GAMBOL');
     levenshtein
    -------------
               2
    (1 row)
    

    2는 두 단어 사이의 편집 거리입니다. 당신은 단어의 숫자에와 종류의 편집 거리의 결과로이 문제를 적용 할 때 당신은 당신이 찾고있는 것을 퍼지 일치의 유형이있을 것이다.

    이 쿼리 샘플을보십시오 : (자신의 개체 이름 물론 데이터)

    SELECT * 
    FROM some_table
    WHERE levenshtein(code, 'AB123-lHdfj') <= 3
    ORDER BY levenshtein(code, 'AB123-lHdfj')
    LIMIT 10
    

    이 쿼리는 말합니다 :

    코드 값과 입력 'AB123-lHdfj'사이의 편집 거리 당신은 코드의 값이 '3 자 차이 내에있는 모든 행을 다시 얻을 것이다 덜 3.보다 여기서 상단을 나에게 some_table 모든 데이터의 10 결과를 AB123-lHdfj '...

    참고 : 오류 등을받을 경우 :

    function levenshtein(character varying, unknown) does not exist
    

    사용 fuzzystrmatch 확장을 설치합니다 :

    test=# CREATE EXTENSION fuzzystrmatch;
    
  2. ==============================

    2.바울은 levenshtein에 대해 말했다 (). 그것은 매우 유용한 도구이지만, 그것은 또한 큰 테이블에 매우 느리다. 그것은 비싼 모든 단일 행에 대한 검색 용어에서 levenshtein 거리를 계산한다.

    바울은 levenshtein에 대해 말했다 (). 그것은 매우 유용한 도구이지만, 그것은 또한 큰 테이블에 매우 느리다. 그것은 비싼 모든 단일 행에 대한 검색 용어에서 levenshtein 거리를 계산한다.

    예를 나타냅니다 귀하의 요구 사항은 간단 경우 우선은, 당신은 여전히 ​​LIKE를 사용할 수 있습니다. 그냥 하나를 교체 - %와 검색어에 WHERE 절을 만들

    WHERE code LIKE "%AB%123%lHdfj%"
    

    대신에

    WHERE code LIKE "%AB-123-lHdfj%"
    

    당신의 진짜 문제는 더 복잡하고 더 빨리 무언가를해야하는 경우 - 요구 사항에 따라 - 몇 가지 옵션이 있습니다.

    패턴 매칭 기술의 개요

  3. from https://stackoverflow.com/questions/7730027/how-to-create-simple-fuzzy-search-with-postgresql-only by cc-by-sa and MIT license