2016-01-21 10 views
6

Próbuję umożliwić przeszukiwanie mojej kolekcji mongodb. Jestem w stanie zrobić przeszukiwanie tekstu po indeksowaniu kolekcję tekstemCzy istnieje sposób na zobaczenie wszystkich indeksowanych terminów w indeksie tekstowym Mongodb?

db.products.createIndex({title: 'text'}) 

Zastanawiam się, czy to możliwe, aby pobrać listę wszystkich kategoriach indeksu dla tej kolekcji. Byłoby to bardzo przydatne do automatycznego uzupełniania i sprawdzania pisowni/korekty, gdy ludzie piszą swoje zapytania.

Odpowiedz

0

Czy jest to , którego szukasz?

+0

Niezupełnie. Poszukuję terminów, które można przeszukiwać po tym, jak mongodb przygotował indeks tytułów, który jest zbiorem odrębnych słów znajdujących się w polach tytułowych wszystkich produktów, każdy termin w jakiś sposób wskazuje na listę produktów, których tytuł zawiera. Mimo wszystko dziękuję za odpowiedź, funkcja ta może być przydatna. –

2

Nie ma wbudowanej funkcji w MongoDB. Możesz jednak łatwo uzyskać te informacje za pomocą zapytania o agregację.

Załóżmy, że Twoja kolekcja zawiera następujące dokumenty:

{ "_id" : ObjectId("5874dbb1a1b342232b822827"), "title" : "title" } 
{ "_id" : ObjectId("5874dbb8a1b342232b822828"), "title" : "new title" } 
{ "_id" : ObjectId("5874dbbea1b342232b822829"), "title" : "hello world" } 
{ "_id" : ObjectId("5874dbc6a1b342232b82282a"), "title" : "world title" } 
{ "_id" : ObjectId("5874dbcaa1b342232b82282b"), "title" : "world meta" } 
{ "_id" : ObjectId("5874dbcea1b342232b82282c"), "title" : "world meta title" } 
{ "_id" : ObjectId("5874de7fa1b342232b82282e"), "title" : "something else" } 

zapytanie to da nam informacji na temat słów:

db.products.aggregate([ 
    { 
     $project:{ 
     words:{ 
      $split:["$title"," "] 
     } 
     } 
    }, 
    { 
     $unwind:"$words" 
    }, 
    { 
     $group:{ 
     _id:"$words", 
     count:{ 
      $sum:1 
     } 
     } 
    }, 
    { 
     $sort:{ 
     count:-1 
     } 
    } 
]) 

ten wyjściowe Liczba wystąpienia dla każdego słowa:

{ "_id" : "title", "count" : 4 } 
{ "_id" : "world", "count" : 4 } 
{ "_id" : "meta", "count" : 2 } 
{ "_id" : "else", "count" : 1 } 
{ "_id" : "something", "count" : 1 } 
{ "_id" : "new", "count" : 1 } 
{ "_id" : "hello", "count" : 1 } 

Jeśli używasz programu MongoDB 3.4, możesz uzyskać niezależne od wielkości liter/diakrytyczne słowo kluczowe insencja statystyki dotyczące słów z nową opcją collation.

na przykład, załóżmy, że nasza kolekcja zawiera teraz następujące dokumenty:

{ "_id" : ObjectId("5874e057a1b342232b82282f"), "title" : "title" } 
{ "_id" : ObjectId("5874e05ea1b342232b822830"), "title" : "new Title" } 
{ "_id" : ObjectId("5874e067a1b342232b822831"), "title" : "hello world" } 
{ "_id" : ObjectId("5874e076a1b342232b822832"), "title" : "World Title" } 
{ "_id" : ObjectId("5874e085a1b342232b822833"), "title" : "World méta" } 
{ "_id" : ObjectId("5874e08ea1b342232b822834"), "title" : "World meta title" } 
{ "_id" : ObjectId("5874e0aea1b342232b822835"), "title" : "something else" } 

dodać opcję sortowania do kwerendy agregacji:

db.products.aggregate([ 
    { 
     $project:{ 
     words:{ 
      $split:["$title"," "] 
     } 
     } 
    }, 
    { 
     $unwind:"$words" 
    }, 
    { 
     $group:{ 
     _id:"$words", 
     count:{ 
      $sum:1 
     } 
     } 
    }, 
    { 
     $sort:{ 
     count:-1 
     } 
    } 
], 
{ 
    collation:{ 
     locale:"en_US", 
     strength:1 
    } 
}) 

to wyjście będzie:

{ "_id" : "title", "count" : 4 } 
{ "_id" : "world", "count" : 4 } 
{ "_id" : "méta", "count" : 2 } 
{ "_id" : "else", "count" : 1 } 
{ "_id" : "something", "count" : 1 } 
{ "_id" : "new", "count" : 1 } 
{ "_id" : "hello", "count" : 1 } 

Siła to poziom porównania do wykonania:

collation.strength: 1 // case insensitive + diacritic insensitive 
collation.strength: 2 // case insensitive only 
+0

Dziękuję bardzo @felix. To jest świetna odpowiedź i bardzo mi pomogła! – BassT

1

Jeśli założymy autoCompleteTerm to wartość wejściowego można uzyskać listę tytułu korzystania z tej kwerendy:

db.products.distinct('title', { $text: { $search: autoCompleteTerm } }) 
Powiązane problemy