2016-06-21 47 views
3

私はPostgreSQLデータベースにBagの種類を格納しています:["Clutch Bags"、 "Shoulder Bags"、 "Tote Bags"]。私はPythonフラスコベースのAPIエンドポイントを使って、ユーザーが "Red Shoulder Bag"や "Gray Clutch Bag"のような検索語を提供できるようにしています。今私はSQLAlchemyを使ってクエリを書いて、これらの与えられた検索語のために、私のバッグテーブルでその値を探すことができるようにしたいと思います。私はこれを書いたが、ユーザが入力した検索文字列が複数ある場合にのみ動作しますが、このdoesntの仕事は、ユーザーが「灰色のクラッチバッグ」SQLAlchemy部分文字列フィルタリング

categories = db.session.query(Bags.id) \ 
    .filter(literal(search_string).ilike(func.concat('%', Bags.type, '%')))\ 
    .all() 

は、どのように私は取り除くことができます入力した場合に、データベース内袋タイプから末尾の「S」フィルタリングの時間?シンプルLIKEまたは「含んでいる」と一致する「クラッチバッグ」と「灰色のクラッチバッグ」のための方法はありません

type_in_db = "Clutch Bags" 
search_string = "Grey Clutch Bag" 

if type_in_db.rstrip('s') in search_string: 
    return type_in_db 
+0

、search_string'で 'func.lower(Bags.typeが)' __ .__含まSEARCH_STRINGに等しい(func.lower (Bags.type)) 'というエラーメッセージが表示され、[' str .__ contains__'は別の文字列が必要です。](https://docs.python.org/3/reference/expressions.html#in)。 –

+0

クローズドパレンもあまりにも多いようです。 – coralvanda

+0

私はPostgreSQLデータベースにBagの種類を格納していると言いますが、タグはmysqlと言っていますか? – middlestump

答えて

0

:私はそのようなことを照会することができるようにしたいです。 デザインを再考する必要があります。

ここにその方向の考えがあります。

MySQLには、「単語」で動作するFULLTEXTタイプのインデックスがあります。 「バッグ」と「バッグ」が一致するように英語の単数形/複数形を理解しています。ただし、FULLTEXTにはいくつかの制限があります。あなたの1つの例がそれらのいずれかに当たらないかもしれないが、他の状況があるかもしれない。

テーブルの作成と検索文字列の作成の両方で、入力をクリーンにすることができます。これには、句読点、複数形、大文字、同義語などを削除することが含まれます。

長期的には、サードパーティのソフトウェア(SQLAlchemyなど)は避ける必要があります。彼らはデータベースとその再定式化の両方を学ばなければならない傾向があります。また、必要な詳細を得ることもできません。

2

私は非常にexpirienced Pythonの開発者が、なぜないだけではないです:エラーについては

categories = db.session.query(Bags.id) \ 
.filter(Bags.type.like('%'+search_string+'%'))\ 
.all() 
+0

これが答えです。もっと具体的にするために、 '.filter(Bags.type.like( '%Clutch Bag%'))'は "Grey Clutch Bags"にマッチします。 – Julian

関連する問題