5

Koperta:MongoDB pełnym i częściowym Text Search

  • MongoDB (3.2.0) z Mongos

Kolekcja:

  • użytkowników

Tekst tworzenie indeksu:

BasicDBObject keys = new BasicDBObject(); 
    keys.put("name","text"); 

    BasicDBObject options = new BasicDBObject(); 
    options.put("name", "userTextSearch"); 
    options.put("unique", Boolean.FALSE); 
    options.put("background", Boolean.TRUE); 

    userCollection.createIndex(keys, options); // using MongoTemplate 

dokumentu:

  • { "name": "leonel"}

Zapytania:

  • db.users.find({ "$text" : { "$search" : "LEONEL" } }) => ZNALEZIONO
  • db.users.find({ "$text" : { "$search" : "leonel" } }) => FOUND (wyszukiwanie caseSensitive jest fałszywy)
  • db.users.find({ "$text" : { "$search" : "LEONÉL" } }) => FOUND (search z diacriticSensitive jest fałszywa)
  • db.users.find({ "$text" : { "$search" : "LEONE" } }) => FOUND (Partial wyszukiwania)
  • db.users.find({ "$text" : { "$search" : "LEO" } }) => NOT FOUND (Partial wyszukiwania)
  • db.users.find({ "$text" : { "$search" : "L" } }) => NOT FOUND (Partial wyszukiwania)

Każdy pomysł, dlaczego otrzymuję 0 wyników używając jako zapytania "LEO" lub "L"?

Regex z wyszukiwaniem indeksu tekstowego jest niedozwolony.

db.getCollection('users') 
    .find({ "$text" : { "$search" : "/LEO/i", 
          "$caseSensitive": false, 
          "$diacriticSensitive": false }}) 
    .count() // 0 results 

db.getCollection('users') 
    .find({ "$text" : { "$search" : "LEO", 
          "$caseSensitive": false, 
          "$diacriticSensitive": false }}) 
.count() // 0 results 

Mongo Dokumentacja:

+0

Możliwy duplikat [MongoDB: Czy można wykonać zapytanie bez rozróżniania wielkości liter?] (Https://stackoverflow.com/questions/1863399/mongodb-is-it-possible-to-make-a-case- niewrażliwe zapytanie) –

+0

To pytanie jest związane z częściowym wyszukiwaniem przy użyciu indeksu tekstowego i bez rozróżniania wielkości liter. @LucasCosta, proszę nie oznaczać tego pytania jako zduplikowane. – Leonel

+0

Jest to możliwe, potrzebuje co najmniej 5 głosów @Leonel –

Odpowiedz

10

Na MongoDB 3.4,Funkcjazostała zaprojektowana w celu obsługi wyszukiwania bez rozróżniania wielkości liter w treści tekstowej za pomocą specyficznych dla języka reguł dla stopwordów i wyrazów. Reguły sprawdzania dla supported languages opierają się na standardowych algorytmach, które na ogół obsługują typowe czasowniki i rzeczowniki, ale nie są świadome właściwych rzeczowników.

Nie ma jednoznacznego wsparcia dla dopasowań częściowych lub rozmytych, ale warunki, które mogą prowadzić do podobnego wyniku, mogą działać jako takie. Na przykład: "smak", "smak" i gustowny "wszystko zależy od" smaku "Wypróbuj stronę Snowball Stemming Demo, aby eksperymentować z większą liczbą słów i algorytmów.Narzędzie

Twoje wyniki, które pasują, to wszystkie odmiany tego samego słowa" LEONEL "i różnią się tylko przypadkiem i literą diakrytyczną.Jeżeli" LEONEL "nie może być skrócony o jakieś zasady wybranego języka, są to jedyne typy dopasowań.

Jeśli chcesz wykonywać wydajne mecze częściowe, musisz zastosować inne podejście. Dla niektórych osób pomysły patrz:

Jest odpowiedni wniosek poprawę można oglądać/upvote w trackerze emisyjnej MongoDB: SERVER-15090: Improve Text Indexes to support partial word match.