検索テキスト
Overview
このガイドでは、Mongoid を使用して テキスト検索 を実行する方法を学習できます。テキスト検索を使用すると、string 値を持つフィールドを効率的にクエリできます。
MongoDB は、string 値または string 要素の配列である値を持つフィールドに対するテキスト検索クエリをサポートするために テキストインデックス を提供します。 テキスト インデックスの詳細については、サーバー マニュアルの「 自己管理型配置のテキスト インデックス 」を参照してください。
注意
Atlas Search
このガイドでは、テキスト検索に焦点を当てています。 データベースがMongoDB Atlasでホストされている場合は、 Atlas Search 機能を使用して、より強力で柔軟なテキスト検索を実行できます。 Atlas Search の詳細については、Atlas ドキュメントの「 Atlas Search の概要 」を参照してください。
次の手順を実行して、テキスト検索を実行できます。
モデルに テキスト インデックス を定義します。
ターゲットコレクションにテキストインデックスを作成します。
テキスト検索クエリーを実行します。
次のセクションでは、これらの各アクションを実行する方法について説明します。
モデルにテキストインデックスを定義する
モデル定義でテキストインデックスを指定するには、index
マイクロを使用します。 次のコードでは、description
フィールドにテキストインデックスを含む Dish
モデルクラスが作成されます。
class Dish include Mongoid::Document field :name, type: String field :description, type: String index description: 'text' end
注意
上記のコードの 'text'
に示されているように、インデックスタイプを string として指定する必要があります。
テキストインデックスの作成
次に、コレクションにテキストインデックスを作成する必要があります。 Atlas UIや Compass などのインターフェースを使用してインデックスを作成できます。Railsフレームワークを使用してアプリケーションを開発している場合は、次の Rakeタスクを実行して、モデル仕様に基づいてインデックスを作成できます。
bundle exec rake db:mongoid:create_indexes
Mongoid でインデックスを使用する方法の詳細については、「 インデックスを使用したクエリの最適化 」ガイドをご覧ください。
テキスト検索の実行
テキスト検索を実行するには、 $text
評価クエリ演算子を使用し、その後にクエリフィルターの $search
フィールドを使用します。 $text
演算子は、テキスト インデックス フィールドに対してテキスト検索を実行します。 $search
フィールドは、テキスト インデックス フィールドで検索するテキストを指定します。 この演算子の詳細については、サーバー マニュアルの $text参照を参照してください。
タームで検索
タームを検索するには、クエリフィルターでタームを string として指定します。 複数のタームを検索するには、string 内にスペースで各タームを区切ります。
注意
複数のタームの検索
複数のタームを検索する場合、Mongoid はテキスト インデックス フィールドに少なくとも 1 つのタームを含むドキュメントを返します。
string 'cake coffee cream'
を使用して検索するとします。 次のリストでは、このテキストクエリに一致する値を説明します。
'Has strong coffee notes.'
'Good for creamy coffee fans.'
'A rich but light cake.'
'A creamy coffee cake with cranberries.'
次の例では、 'herb'
タームを含む description
値のテキスト検索を実行します。
Dish.where('$text' => {'$search' => 'herb'})
# Sample output {"_id":"...","description":"A bright, herb-based salad. A perfect starter for vegetarians and vegans.","name":"Kale Tabbouleh"} {"_id":"...","description":"Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4.","name":"Herbed Whole Branzino"}
フレーズで検索
フレーズを検索するには、クエリフィルターの string として、エスケープされた引用符を含むフレーズを指定します。 フレーズの前後にエスケープされた引用符を追加しない場合、Mongoid はターム検索を実行します。
Tip
エスケープされた引用符は、バックスラッシュ文字(\
)とそれに続く二重引用符文字("
)です。
次の例では、 "serves 2"
というフレーズを含む description
値のテキスト検索を実行します。
Dish.where('$text' => {'$search' => "\"serves 2\""})
# Sample output {"_id":"...","description":"A vegetarian take on the classic dish that uses lentils as a base. Serves 2.","name":"Shepherd’s Pie"} {"_id":"...","description":"Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2.","name":"Garlic Butter Trout"}
除外されたタームの検索
テキスト検索から除外する各タームまたはフレーズは、クエリフィルターの string としてマイナス記号(-
)を付けたタームまたはフレーズを指定します。
重要
検索からタームを除外するには、少なくとも 1 つのタームを検索する必要があります。 タームを検索しない場合、Mongoid はドキュメントを返しません。
次の例では、 'vegan'
タームを含むが 'tofu'
タームは含まない description
値のテキスト検索を実行します。
Dish.where('$text' => {'$search' => 'vegan -tofu'})
# Sample output {"_id":"...","description":"A bright, herb-based salad. A perfect starter for vegetarians and vegans.","name":"Kale Tabbouleh"}
詳細情報
クエリフィルターの作成の詳細については、「 ドキュメントクエリの指定 」を参照してください。