2017-01-09 5 views
1

私はモンゴはmoment.Itで全文検索$正規表現などの操作をサポートしていないことを知っているだけで、私はインデックスさfields.Soにクエリ検索のように実行する必要があるテキストやphrase.Butに一致するIこの問題を解決するための複数の検索フレームワークやその他の回避策の選択に関する助けが必要です。mongodbの全文検索で「好き」のクエリを実行するにはどうすればよいですか?

私はドキュメント構造をネストしています。例えばのため:

{ 
"name": "John", 
"phones": [{ 
    "phone_number": "1234", 
    "is_primary": true 
}, { 
    "phone_number": "5678", 
    "is_primary": false 
}] 
} 

私はのApache Solrのを使用して試してみましたが、私はそれがネストされた文書のための良いサポートを提供していないことがわかりました。それは構造体を平坦化し、フィールドをインデックス化しますが、私が上で議論したようなクエリを実行しようとすると、うまくいきませんでした。

私はscala、play、mongodbを使用しています。今は入れ子構造のドキュメント構造を変更することはできません。強力な検索フレームワークを開発するためにmongodbと統合できる適切な検索プラットフォームは何ですか?どのようにこの問題を処理することができますか?このシナリオでは、どのようなアプローチが最適でしょうか?

+0

mongodbでフルテキスト検索をサポートするには 'text index'を作成する必要があります –

+0

@ShaishabRoy私は既にテキストインデックスを作成しています。私が必要とするのは、テキスト検索内の$ regex検索です。 – oblivion

+0

テキスト検索を実行するには '$ regex'を使う必要はありません。あなたは' $ text'と '$ search'を使うべきです。私の答えを見ることができます@oblivion –

答えて

1

フルテキスト検索のように実行するには、text indexを作成してから使用します。あなたはまた、複数のフィールドを作成することができ、単一のフィールドに表示されるテキストインデックスここ

db.colectionName.createIndex({ fieldName: "text" }); 

を作成するmore about text index

構文。覚えておいてください

コレクションには最大で1つのテキストインデックスを付けることができます。

は、あなたは $text

var searchText= 'some text to search'; 
db.collectionName.find({ $text: { $search: searchText} }); 

しかし$regexを使用することができますtext indexを作成する必要はありませんが、一致シーケンスマッチングやパターンへ$searchを使用して検索することができます。

var searchName ='som'; 
db.collectionName.find({"name":{ $regex: searchName, $options: 'i' }}) 

$regexと部分的に一致するクエリです。例えば、あなたのデシベルでname:'some text to search'はそれほどパフォーマンス向上のためsomesomomerex ...

ようsearchName値はnameフィールド

+0

私はテキスト検索のようなクエリを実行する必要があります。 例: db.colectionName.createIndex({fieldName: "text"}); db.colectionName.insert({"text": "検索するもの"}); db.collectionName.find({$ text:{$ search: "som"}}); ご覧のとおり、テキスト検索で$ regexのようなものが必要でした。 – oblivion

+0

'$ regex'が正確なシーケンスマッチングや' text search'のようなパターンマッチングには使用されていません。 –

+0

私は実際のテキストの部分文字列を使って検索できる部分テキスト検索を探しています。 – oblivion

0

ため、通常のインデックスを作成することができます場合は、SOLRでこれを行うことができ、データを返すが、あなたすることができます必要なクエリの種類を事前に定義し、インデックスを独創的な方法でフラット化して、必要なものをクエリして取得できるようにする必要があります。複数値のフィールドを使用して、複数の値を格納することができます。クライアントがインスタンス化する必要がある場合は、オブジェクト全体のJSONバージョンをテキストフィールドに格納できます。

たとえば、あなたは別にプライマリとセカンダリを格納することができ:

phone_number_primary: 1234,... 
phone_number_secondary: 5678,... 
my_json_blob: {OBJECT HERE} 

、あなたが個別に取得して照会することができます。

<copyField source="phone_number_*" dest="phone_number_all" /> 

して、このフィールドを検索:あなたは両方を検索したい場合は、

(phone_number_primary:1234 OR phone_number_secondary:1234) 

か、あなたのスキーマ内の両方の数値を格納し、余分なフィールドを定義することができ、両方を照会することができます。

関連する問題