1

私のアプリケーションは、フィールドにキーワードのリストがある Mongo データベース内のドキュメントに対して着信文字列を照合しようとしています。目標は、キーワードが文字列に存在するかどうかを確認することです。

次に例を示します。

入力文字列:

"John Doe is from Florida and is a fan of American Express"

MongoDB のドキュメントのフィールドには、次のような値があります。

in_words: "georgia,american express"

そのため、データベース レコードにはカンマで区切られた単語またはキーワードがあり、それらのいくつかは 2 単語以上です。

現在、私の RoR アプリケーションはドキュメントをプルし、それぞれのインワードをプルして、インワードで split(',') コマンドを発行し、それぞれをループして、文字列に存在するかどうかを確認します。

処理を高速化するために、このタイプの検索を実際のデータベース クエリにプッシュする方法を見つけたいと思っています。データベースの in_words を次のような配列に変更できます。

in_words: ["georgia", "american express"] 

しかし、これを照会する方法がまだわかりませんか?

要約すると、私の目標は、その人のインワード/キーワードのリストを着信文字列と比較して、着信文字列に一致する人を見つけることです。そして、このクエリはすべてデータベース層で実行します。

ご提案いただきありがとうございます

4

2 に答える 2

1

最初のステップとして、間違いなく in_words を配列に分割する必要があります。

あなたのクエリはまだ難しいものです。

次に、その配列フィールドに対して$regexクエリを使用することを検討してください。

入力文字列から任意の 1 つの単語に一致させる必要があるため、正規表現の構築は少し難しくなります。入力文字列の部分文字列をデータベースと照合するブログ エントリ (通常の LIKE 操作の逆)から、適切な正規表現を構築する方法についてさらにアイデアを得ることができます。

于 2012-04-22T03:55:14.123 に答える
0

長い文字列を個別のトークンに分割し、それらを個別の配列に入れることでこれを解決できます。また、$allクエリを使用して、一致するキーワードを効果的に見つけます。

サンプルをチェックする

> db.splitter.insert({tags:'John Doe is from Florida and is a fan of American Express'.split(' ')})
> db.splitter.insert({tags:'John Doe is a super man'.split(' ')})
> db.splitter.insert({tags:'John cena is a dummy'.split(' ')})
> db.splitter.insert({tags:'the rock rocks'.split(' ')})

クエリを実行すると

> db.splitter.find({tags:{$all:['John','Doe']}})

それは戻るだろう

> db.splitter.find({tags:{$all:['John','Doe']}})
{ "_id" : ObjectId("4f9435fa3dd9f18b05e6e330"), "tags" : [  "John",     "Doe",  "is",   "from",     "Florida",  "and",  "is",   "a",    "fan",  "of",   "American",     "Express" ] }
{ "_id" : ObjectId("4f9436083dd9f18b05e6e331"), "tags" : [ "John", "Doe", "is", "a", "super", "man" ] }

この操作では大文字と小文字が区別されることに注意してください。

部分一致を探している場合は、$in代わりに使用してください$all

また、正確な結果を得るには、挿入する前におそらくノイズ ワード ('a'、'the'、'is'...) を削除する必要があります。

私はそれが明確であることを願っています

于 2012-04-22T16:54:01.243 に答える