2017-11-10 5 views
1

나는 이것에 대해 많이 연구했지만 아직까지는 최상의 솔루션을 찾지 못했습니다.postgresql에서 다중 열과 부분 검색을 사용하는 Sqlalchemy 전체 텍스트 검색

Class User(DeclarativeBase): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    first_name = Column(String) 
    last_name = Column(String) 
    description = Column(String) 

사용자와 : 우리는 다음과 같은 테이블이 있다고 가정

  • 앤디 | 존슨 | ㅋㅋㅋ

  • Andress | 부시 | 되어야 ㅋ

검색이 first_name, last_namedescription 및 컬럼을 포함한다.

ohns 쿼리를 검색하고 싶습니다. 제 결과와 일치하는 열이 무엇인지 어떻게 든 알기를 원합니다. 결과가 정확히 일치하거나 부분 일치하는 것과 일치합니까?

나는 3 개의 언급 된 열이있는 ts_vector 하나를 시도했지만 검색 결과에 대한 자세한 내용을 추출 할 수 없습니다. 필자는 어떻게 든 전체 텍스트를 pg_trgm 함수와 결합해야합니까?

답변

1

트라이 그램 유사성을 사용하면 일치 유형 및 관련 열에 대한 정확한 정보를 얻을 수 있다고 생각합니다.

SELECT "first_name", "last_name", "description", 
     CASE 
      WHEN SIMILARITY("first_name", 'ohns') >= 1.0 THEN 'exact' 
      WHEN SIMILARITY("first_name", 'ohns') > 0.0 THEN 'partial' 
      ELSE 'no' 
     END AS "first_name_match", 
     CASE 
      WHEN SIMILARITY("last_name", 'ohns') >= 1.0 THEN 'exact' 
      WHEN SIMILARITY("last_name", 'ohns') > 0.0 THEN 'partial' 
      ELSE 'no' 
     END AS "last_name_match", 
     CASE 
      WHEN SIMILARITY("description", 'ohns') >= 1.0 THEN 'exact' 
      WHEN SIMILARITY("description", 'ohns') > 0.0 THEN 'partial' 
      ELSE 'no' 
     END AS "description_match" 
FROM (VALUES 
    ('Andy', 'Johnson', 'blah blah blah'), 
    ('Andress', 'Bush', 'blah blah'), 
    ('Ohns', 'Johnson', 'blah') 
) AS I("first_name", "last_name", "description") 
WHERE (SIMILARITY("first_name", 'ohns') + SIMILARITY("last_name", 'ohns') + SIMILARITY("description", 'ohns')) > 0.0 

first_name | last_name | description | first_name_match | last_name_match | description_match 
------------+-----------+----------------+------------------+-----------------+------------------- 
Andy  | Johnson | blah blah blah | no    | partial   | no 
Ohns  | Johnson | blah   | exact   | partial   | no 

당신이있어 행동에 SQL을 볼 수 있습니다 :

http://sqlfiddle.com/#!17/9eecb/6356

나는 데모로 간단한 SQL 예제를 만들어
관련 문제