ค้นหาข้อความแบบเต็มด้วยน้ำหนักเป็นพังพอน

ดังที่ฉันทราบ ตั้งแต่เวอร์ชัน 3.8.9 พังพอนรองรับการค้นหาข้อความแบบเต็ม แต่ฉันไม่พบเอกสารที่ดีสำหรับมัน!
ฉันต้องการดำเนินการดังนี้:

db.collection.ensureIndex(
    // Fields to index
    {
        animal:  "text",
        color:   "text",
        pattern: "text",
        size:    "text"
    },

    // Options
    {
        name: "best_match_index",

        // Adjust field weights (default is 1)
        weights: {
            animal: 5,  // Most relevant search field
            size:   4   // Also relevant
       }
    }
)

กับพังพอนบริสุทธิ์ทำได้ไหม? หรือฉันต้องใช้ปลั๊กอินบางตัวเช่น mongoose-text-search? ถ้าไม่มีน้ำหนักล่ะ
แล้วจะทำยังไงล่ะ?


person Foad Nosrati Habibi    schedule 12.07.2014    source แหล่งที่มา
comment
คุณได้ลองโทร index บนสคีมาเพื่อเพิ่มดัชนีข้อความหรือไม่   -  person JohnnyHK    schedule 12.07.2014
comment
ฉันทำในสคีมาเป็นดัชนี: 'ข้อความ' แต่ฉันต้องการสร้างดัชนีในหลาย ๆ ฟิลด์ตามตัวอย่างข้างต้น   -  person Foad Nosrati Habibi    schedule 12.07.2014
comment
อย่าประกาศไว้ในคำจำกัดความสคีมาของคุณ เรียก เมธอด index ของสคีมาของคุณ mongoosejs.com/docs/api.html#schema_Schema-index   -  person JohnnyHK    schedule 13.07.2014
comment
คุณหมายถึง 'schema.index({ animal: text, color: text, pattern: text, size: text })' ? แล้วน้ำหนักล่ะ? และสร้างดัชนีเดียวหรือ 4 ดัชนี?   -  person Foad Nosrati Habibi    schedule 13.07.2014


คำตอบ (4)


ได้ คุณสามารถใช้การค้นหาข้อความแบบเต็มใน Mongoose >= 3.8.9 ได้ ประการแรก คอลเลกชันสามารถมีดัชนีข้อความได้มากที่สุดหนึ่งดัชนี (ดู เอกสาร) ดังนั้น เพื่อกำหนดดัชนีข้อความสำหรับ หลายฟิลด์ คุณต้องมีดัชนีผสม:

schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' });

ตอนนี้คุณสามารถใช้แบบสอบถาม $text ได้แล้ว โอเปอเรเตอร์ เช่นนี้:

Model
    .find(
        { $text : { $search : "text to look for" } }, 
        { score : { $meta: "textScore" } }
    )
    .sort({ score : { $meta : 'textScore' } })
    .exec(function(err, results) {
        // callback
    });

นอกจากนี้ยังจะเรียงลำดับผลลัพธ์ตามคะแนนความเกี่ยวข้องอีกด้วย

สำหรับ น้ำหนัก คุณสามารถลองส่งน้ำหนักได้ options คัดค้านวิธี index() (โดยที่คุณกำหนดดัชนีผสม) (ทำงานอย่างน้อยกับ v4.0.1 ของพังพอน):

schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' }, {name: 'My text index', weights: {animal: 10, color: 4, pattern: 2, size: 1}});
person eagor    schedule 26.08.2014
comment
ข้อผิดพลาดที่ส่งคืน: ต้องการดัชนีข้อความเพียงรายการเดียวสำหรับการสืบค้น $text - person Mallen; 29.09.2014
comment
เพื่อกำหนดดัชนีข้อความสำหรับหลายๆ ฟิลด์ คุณต้องมีดัชนีผสม ตรวจสอบให้แน่ใจว่าคุณกำหนดดัชนีผสมถูกต้อง - person eagor; 30.09.2014
comment
ขั้นตอนนี้มีบันทึกไว้ที่ไหนสักแห่งหรือไม่? ฉันกำลังพยายามใช้ดัชนีข้อความกับพังพอน แต่มันไม่ทำงาน ฉันได้สร้างดัชนีแบบผสม ฉันใช้ตัวดำเนินการ $text เหมือนตัวอย่างของคุณ แต่ผลลัพธ์จะเป็นเอกสารว่างเสมอ - person ira; 04.01.2015
comment
ดู $text doc และ บทช่วยสอนการค้นหาข้อความ Mongoose เวอร์ชั่นของคุณคืออะไร? (การค้นหาข้อความแบบเต็มใช้งานได้กับเวอร์ชัน ›= 3.8.9) - person eagor; 04.01.2015
comment
ลิงก์เอกสารเหล่านั้นมีไว้สำหรับ Mongo มีอะไรสำหรับ Mongoose บ้างไหม? - person Michael Cole; 11.06.2015
comment
ด้วยพังพอนเวอร์ชัน 4.0.1 ตัวเลือกตุ้มน้ำหนักสามารถใช้งานได้ - person Anthony O.; 10.09.2015
comment
@Mallen คุณพบวิธีแก้ปัญหาหรือไม่? - person OMGPOP; 07.12.2015
comment
ฉันกำลังพยายามเข้าถึงคุณสมบัติคะแนนหลังจากที่ได้ผลลัพธ์แล้วเพื่อแสดงบนแอปของฉัน แต่ด้วยเหตุผลบางอย่าง ฉันจึงไม่สามารถกำหนดได้ หากฉัน console.log อาร์เรย์ผลลัพธ์ ฉันจะเห็นคุณสมบัติคะแนนภายใต้แต่ละอ็อบเจ็กต์ แต่ถ้าฉันพยายามเข้าถึงมันเป็นพิเศษ ฉันจะไม่ได้กำหนดไว้ มีแนวคิดใดบ้างว่าทำไมหรือต้องทำเช่นนี้อย่างถูกต้อง? ขอบคุณ. - person Alejandro Corredor; 15.06.2017
comment
ขอบคุณมันทำงานได้อย่างสมบูรณ์แบบสำหรับการสร้างดัชนีเมื่อใช้พังพอน คุณช่วยกรุณาแจ้งให้เราทราบวิธีการวางดัชนีในพังพอนได้ไหม - person Goutham; 22.06.2017

ใน MongoDB 2.6 คอลเลกชันสามารถมีดัชนีข้อความได้มากที่สุดหนึ่งรายการ (มีเอกสาร ที่นี่) ดังนั้นคุณจะไม่สามารถทำสิ่งที่คุณต้องการด้วย MongoDB เวอร์ชันปัจจุบันได้ จริงๆ แล้ว สำหรับปัญหาการค้นหาข้อความที่ซับซ้อนซึ่งมีข้อกำหนดน้ำหนักที่แตกต่างกันโดยขึ้นอยู่กับตำแหน่งของรายการที่ตรงกัน คุณควรพิจารณาโซลูชันการค้นหาข้อความเต็มรูปแบบ เช่น Solr หรือ ElasticSearch

เพื่อเป็นวิธีแก้ปัญหาใน MongoDB คุณสามารถโทเค็นฟิลด์ด้วยตนเอง จัดเก็บเป็นอาร์เรย์คำหลัก และจัดทำดัชนีได้:

animal: ["The", "quick", "brown", "fox", "jump", ..., "dog"]

จากนั้นแบบสอบถามเช่น

db.test.find({สัตว์: {$in: ["สีน้ำตาล", "รองเท้า"]})

เลียนแบบการค้นหาข้อความ วิธีการนี้มีข้อจำกัดบางประการ เช่น การทำงานด้วยตนเองที่จำเป็นในการตั้งค่า ความจริงที่ว่าจะไม่มีอุปสรรค เช่น จับคู่ "ความฝัน" กับ "ความฝัน" ความจริงที่ว่าคำหยุดจะไม่ถูกลบออกเหมือนใน ดัชนีข้อความปกติ และไม่มีกลไกการถ่วงน้ำหนักใดๆ

person wdberkeley    schedule 24.07.2014
comment
อันที่จริงฉันมีดัชนีข้อความเพียงอันเดียวที่มีหลายฟิลด์ รหัสระเบิดเป็นส่วนหนึ่งของ .getIndexes() ฉันทำโดยใช้ mongoose-text-search ฉันกำลังมองหา รุ่นพังพอนบริสุทธิ์ของมัน ` { v : 1, คีย์ : { _fts : ข้อความ, _ftsx : 1 }, ns : public-diary-dev.diaries, ชื่อ : full-search-index, พื้นหลัง : true, น้ำหนัก : { แท็ก : 1, ข้อความ : 1 , หัวเรื่อง : 1 }, default_ภาษา : อังกฤษ, language_override : ภาษา, textIndexVersion : 1 } ` - person Foad Nosrati Habibi; 27.07.2014

ฉันพบบทความต่อไปนี้ซึ่งนำฉันไปสู่ ​​http://code.tutsplus.com/tutorials/full-text-search-in-mongodb--cms-24835 ฉันทิ้งดัชนีที่สร้างในคำตอบยอดนิยมโดยใช้สิ่งต่อไปนี้

db.tablename.dropIndex({"indexname_text"})  

ฉันได้รับรายการดัชนีด้วยคำสั่งนี้

db.tablename.getIndexes()

ฉันใช้สิ่งต่อไปนี้เพื่อสร้างดัชนี

db.tablename.createIndex({"$**":"text"})

คำสั่งต่อไปนี้ทำงานใน Mongoose

model.find(
    {$text: {$search: "text you are searching for"}},
    {score: {$meta: "textScore"}})
    .sort({score:{$meta:"textScore"}}
)
.exec(function(err, results) {
    `enter code here`if(!err){
    console.log('results ' + results);
}
else
{
    console.log(err);
}
});
person Gordon Deudney    schedule 14.07.2016

person    schedule
comment
คำตอบนี้คือระเบิด! ฉันเสียเวลาสองชั่วโมงที่ผ่านมาในการพยายามเพิ่มดัชนีข้อความให้กับสคีมาของฉัน และคำตอบง่ายๆ แค่นี้ก็เพียงพอแล้ว ฮัซซาห์! - person ecg8; 24.02.2018
comment
ใช่ เป็นเช่นนั้น แต่คุณไม่สามารถสร้างข้อความค้นหาที่เป็นมิตรต่อมนุษย์โดยหลีกเลี่ยงการใช้นิพจน์ทั่วไปได้ - person Akhmedzianov Danilian; 13.05.2018
comment
โปรดใช้ความระมัดระวังเนื่องจากอาจส่งผลให้เกิด การปฏิเสธ regex เกี่ยวกับช่องโหว่ในการให้บริการ - person BrotherDonkey; 08.06.2020