2017-11-10 28 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) 

ユーザーと::私たちは、以下の表があるとし

  • アンディ|ジョンソン|間違った言い方をすると、ブッシュ|あるべき何とか何とか

検索がfirst_namelast_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の例を作りました
関連する問題