programing

mongoose에서 가중치를 사용한 전체 텍스트 검색

linuxpc 2023. 5. 16. 22:12
반응형

mongoose에서 가중치를 사용한 전체 텍스트 검색

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 > = 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
    });

또한 관련성 점수별로 결과를 정렬합니다.

가중치의 경우 가중치 옵션 개체를 메서드(복합 인덱스를 정의하는 경우)에 전달할 수 있습니다(최소한 mongoose의 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}});

MongoDB 2.6에서 컬렉션은 최대 하나의 텍스트 색인(여기에 문서화됨)을 가질 수 있습니다.따라서 현재 버전의 MongoDB로는 원하는 작업을 할 수 없습니다.실제로, 일치하는 위치에 따라 가중치가 다른 복잡한 텍스트 검색 문제의 경우 Solr 또는 ElasticSearch와 같은 완전한 텍스트 검색 솔루션을 고려해야 합니다.

MongoDB에서 해결 방법으로 필드를 수동으로 토큰화하고 키워드 배열로 저장한 다음 인덱스를 작성할 수 있습니다.

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

그렇다면 와 같은 질문

db.test.find 파일: {$in: ["brown", "brown"]}

텍스트 검색을 모방합니다.이 접근법에는 설정에 필요한 수동 작업, 예를 들어 "꿈"과 "꿈"을 일치시키는 데에 기인하지 않는다는 사실, 일반 텍스트 색인처럼 중지 단어가 제거되지 않는다는 사실, 가중치 메커니즘의 부재와 같은 몇 가지 제한이 있습니다.

저는 http://code.tutsplus.com/tutorials/full-text-search-in-mongodb--cms-24835 로 이동하게 된 다음 기사를 찾았습니다. 저는 다음을 사용하여 상위 답변에 작성된 색인을 삭제했습니다.

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

이 명령을 사용하여 인덱스 목록을 가져왔습니다.

db.tablename.getIndexes()

그런 다음 다음 다음을 사용하여 인덱스를 만들었습니다.

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

다음 명령은 몽구스에서 작동했습니다.

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);
}
});
    var searchQuery=new RegExp('dam', 'i');
    var query = { firstName : searchQuery };
    Model.find(query ...

언급URL : https://stackoverflow.com/questions/24714166/full-text-search-with-weight-in-mongoose

반응형