2017-06-19 10 views
0

MongoとSpringを使用した加重部分テキスト検索を実装しようとしています。マイMongoの文書は、このように構成されています。私がやりたい入れ子オブジェクトフィールドの加重を使用したSpring Mongob部分テキスト検索

{ 
    "_id" : ObjectId("5947d610659f8e614887cbc9"), 
    "_class" : "co.ecg.alpaca.model.SearchIndexEntry", 
    "type" : "GroupAccessDevice", 
    "deviceId" : "Bogus_Device", 
    "devicesName" : "Bogus Device", 
    "properties" : { 
     "deviceType" : "Polycom VVX 500", 
     "netAddress" : "", 
     "macAddress" : "000111222111", 
     "serviceProviderId" : "Bogus", 
     "availablePorts" : "12", 
     "groupId" : "Bogus_Group", 
     "version" : "" 
    }, 
    "tags" : [ 
     { 
      "tag" : "Bogus_Device", 
      "score" : 10 
     }, 
     { 
      "tag" : "Bogus Device", 
      "score" : 9 
     }, 
     { 
      "tag" : "000111222111", 
      "score" : 7 
     }, 
     { 
      "tag" : "Bogus_Group", 
      "score" : 3 
     }, 
     { 
      "tag" : "Bogus", 
      "score" : 3 
     } 
    ], 
    "createdBy" : "ALPACA_SYSTEM", 
    "createdDate" : ISODate("2017-06-19T13:48:00.473Z"), 
    "lastModifiedBy" : "ALPACA_SYSTEM", 
    "lastModifiedDate" : ISODate("2017-06-19T13:48:00.473Z"), 
    "cluster" : DBRef("broadworks_cluster", ObjectId("5947d60a659f8e614887cb1a")), 
    "parent" : DBRef("search_index", ObjectId("5947d610659f8e614887cbb7")) 
} 

何tag.nameに対して部分正規表現検索を使用して、正規表現とタグ間のレーベンシュタイン距離を乗じたtag.scoreによってそれらを並べ替えるです。名。私の質問は、これはMongoの1つのクエリ、おそらくいくつかの種類の集計で可能ですか?

+0

組換えフレームワークでLevenshteinの距離を行うことはできません。少なくとも、組換えははるかに複雑であるため、 'kitten - > sitten'の場合はそうではありません。あなたがここでできることは、正規表現として 'Bogus'をマッチさせ、' $ unwind'の後で、 '' $ strLenCP'(https://docs.mongodb.com)で文字列の長さを調べるだけです。/manual/reference/operator/aggregation/strLenCP /)を参照してください。しかし、演算子にはMongoDB 3.4が必要です。 –

+0

関連[MongoDBを "like"で照会する方法](https://stackoverflow.com/q/3305561/2313887)そして、[MongoDBコレクションのオブジェクト配列内の照会された要素のみを取得する](https://stackoverflow.com/q/3985214/2313887) –

答えて

0

私の知る限り、1つのクエリでこれを行うことはできません。モンゴークエリ内で外部関数(つまり、2つの文字列間のLeveninshtein距離を計算する関数)を使用できない理由については、受け入れられた答えhereを参照してください。

たとえば次のクエリでは、あなたがしたい文書が返されます:あなたは、メモリに、タグ配列を自分でソートする必要があります。

db.getCollection('test').aggregate([{$match: {tags: {$elemMatch: {tag: {$regex: 'Bogus'}}}}}]) 

+0

これは私が思ったことです。ありがとう。 – dkelley

関連する問題