Docs Menu

検索テキスト

このガイドでは、Mongoid を使用して テキスト検索 を実行する方法を学習できます。テキスト検索を使用すると、string 値を持つフィールドを効率的にクエリできます。

MongoDB は、string 値または string 要素の配列である値を持つフィールドに対するテキスト検索クエリをサポートするために テキストインデックス を提供します。 テキスト インデックスの詳細については、サーバー マニュアルの「 自己管理型配置のテキスト インデックス 」を参照してください。

注意

Atlas Search

このガイドでは、テキスト検索に焦点を当てています。 データベースがMongoDB Atlasでホストされている場合は、 Atlas Search 機能を使用して、より強力で柔軟なテキスト検索を実行できます。 Atlas Search の詳細については、Atlas ドキュメントの「 Atlas Search の概要 」を参照してください。

次の手順を実行して、テキスト検索を実行できます。

  1. モデルに テキスト インデックス を定義します。

  2. ターゲットコレクションにテキストインデックスを作成します。

  3. テキスト検索クエリーを実行します。

次のセクションでは、これらの各アクションを実行する方法について説明します。

モデル定義でテキストインデックスを指定するには、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"}

Tip

検索タームは'herb' でしたが、 メソッドは'herbs' を含む説明にも一致します。これは、 MongoDBテキストインデックスが類似単語を一致させるために接尾辞の語幹を使用するためです。MongoDB がタームを一致させる方法の詳細については、{{+server-manual} の テキスト インデックスのプロパティ を参照してください。

フレーズを検索するには、クエリフィルターの 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"}

クエリフィルターの作成の詳細については、「 ドキュメントクエリの指定 」を参照してください。

CRUD操作の実行の詳細については、 「データ操作の実行」ガイドを参照してください。