2016-07-11 8 views
0

アドレスを検索するMongoDBクエリがあります。問題は、ユーザーが誤って余分な空白を追加した場合、クエリでアドレスが見つからないということです。たとえば、ユーザーが123 Fakeville Stの代わりに123 Fakeville Stと入力した場合、クエリは結果を返しません。MongoDBクエリで複数の空白文字を無視する

おそらく$regexを使用してこの問題に対処する簡単な方法はありますか?私は、スペースは家の番号(123)と通りの名前(Fakeville)の間で無視する必要があると思う。私のクエリは、このように設定されています

@app.route('/getInfo', methods=['GET']) 
def getInfo(): 
    address = request.args.get("a") 
    addressCollection = myDB["addresses"] 
    addressJSON = [] 
    regex = "^" + address 

    for address in addressCollection.find({'Address': {'$regex':regex,'$options':'i'} },{"Address":1,"_id":0}).limit(3): 
     addressJSON.append({"Address":address["Address"]}) 
    return jsonify(addresses=addressJSON) 

答えて

1

はそれを送信する前にクエリをクリーンアップします。

>> import re 
>>> re.sub(r'\s+', ' ', '123 abc') 
'123 abc' 
>>> re.sub(r'\s+', ' ', '123 abc def ghi') 
'123 abc def ghi' 

あなたはおそらく、あなたのデータベース内のデータも同様に正規化されていることを確認したいと思います。また、句読点のようなものについても同様の戦略を検討してください。

実際、このために正規表現を使用すると、過度に厳しいように見えるだけでなく、ホイールを再改造します。 LuceneやElasticsearchなどの適切な検索エンジンの使用を検討してください。

+0

スーパーの詳細情報を参照してください。ありがとうございました。これは機能します。 LuceneとElasticsearchを調べます。 – mapr

0

正規表現を使用しない別のアプローチでは、MongoDB text indexesを利用することができます。フィールドにテキストインデックスを追加することにより、あなたは、例えば$textオペレータ

を使用してテキスト検索を実行できます。

db.coll.find(
      { $text:{$search:"123 Fakeville St"}}, 
      { score: { $meta: "textScore" } }) 
     .sort({ score: { $meta: "textScore" } }).limit(1) 

これのようなエントリのために働く必要があります。「123 Fakeville聖」、「123 fakeville通りを」 、アドレスの重要な部分は、それを作るなど限り。

$text behaviour

+0

ありがとう、私もこれを試してみます。 – mapr

関連する問題