5

पर्यावरण:MongoDB पूर्ण और आंशिक पाठ खोज

  • MongoDB (3.2.0) MongoS साथ

संग्रह:

  • उपयोगकर्ताओं

पाठ सूचकांक सृजन:

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 

दस्तावेज़:

  • { "नाम": "LEONEL"}

क्वेरी:

  • db.users.find({ "$text" : { "$search" : "LEONEL" } }) => पाया
  • db.users.find({ "$text" : { "$search" : "leonel" } }) => FOUND (खोज caseSensitive झूठा है)
  • db.users.find({ "$text" : { "$search" : "LEONÉL" } }) => FOUND (diacriticSensitive साथ खोज गलत है)
  • db.users.find({ "$text" : { "$search" : "LEONE" } }) => FOUND (आंशिक खोज)
  • db.users.find({ "$text" : { "$search" : "LEO" } }) => नहीं मिला (आंशिक खोज)
  • db.users.find({ "$text" : { "$search" : "L" } }) => नहीं मिला (आंशिक खोज)

कोई विचार मुझे 0 परिणाम "LEO" या "एल" के रूप में उपयोग करने के परिणाम क्यों मिलते हैं?

टेक्स्ट इंडेक्स खोज के साथ रेगेक्स की अनुमति नहीं है।

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 

मोंगो प्रलेखन:

+0

[मोंगोडीबी: संभावित केस-असंवेदनशील क्वेरी बनाना संभव है?] (Https://stackoverflow.com/questions/1863399/mongodb-is-it-possible-to-make-a-case- असंवेदनशील-क्वेरी) –

+0

यह प्रश्न टेक्स्ट इंडेक्स का उपयोग करके आंशिक खोज से संबंधित है और केस संवेदनशील खोज नहीं है। @LucasCosta कृपया इस प्रश्न को डुप्लिकेट के रूप में टैग न करें। – Leonel

+0

यह संभव है, कम से कम 5 वोटों की आवश्यकता @Leonel –

उत्तर

10

MongoDB 3.4 पर के रूप में, text search सुविधा को टेक्स्ट सामग्री पर केस-असंवेदनशील खोजों को रोकने के लिए डिज़ाइन किया गया है जो स्टॉपवर्ड और स्टेमिंग के लिए भाषा-विशिष्ट नियमों के साथ है। supported languages के लिए स्टेमिंग नियम मानक एल्गोरिदम पर आधारित होते हैं जो आम तौर पर सामान्य क्रियाओं और संज्ञाओं को संभालते हैं लेकिन उचित संज्ञाओं से अनजान हैं।

आंशिक या अस्पष्ट मैचों के लिए कोई स्पष्ट समर्थन नहीं है, लेकिन ऐसे परिणाम जो एक समान परिणाम के लिए काम करते हैं, इस तरह काम कर रहे हैं। उदाहरण के लिए: "स्वाद", "स्वाद", और स्वादपूर्ण "सभी स्टेम टू स्वाद"। Snowball Stemming Demo पृष्ठ को और अधिक शब्दों और स्टेमिंग एल्गोरिदम के साथ प्रयोग करने के लिए प्रयास करें।

आपके परिणाम जो मेल खाते हैं वे सभी शब्द " LEONEL ", और केवल मामले और diacritic द्वारा भिन्न होता है। जब तक कि" LEONEL "को आपकी चुनी भाषा के नियमों से कम कुछ नहीं किया जा सकता है, ये एकमात्र प्रकार के भिन्नताएं हैं जो मेल खाती हैं।

यदि आप कुशल आंशिक मिलान करना चाहते हैं तो आपको एक अलग दृष्टिकोण लेने की आवश्यकता होगी। के लिए कुछ उपयोगी विचारों देखें: SERVER-15090: Improve Text Indexes to support partial word match:

द्वारा वहाँ एक प्रासंगिक सुधार अनुरोध आप देख सकते हैं MongoDB समस्या ट्रैकर में/वोट दें है।

संबंधित मुद्दे