MongoDB 전체 텍스트 인덱스를 만드는 방법

Codever 에서 코드 조각을 검색할 때 사용하는 검색어에 따라 관련 결과가 표시됩니다. 이 뒤에는 MongoDb 전체 텍스트 검색 색인이 있습니다. 어떻게 생성되고 사용되는지 봅시다.

전체 텍스트 검색은 텍스트 인덱스를 사용하여 Mongo에서 지원됩니다. 텍스트 인덱스는 값이 문자열이거나 가중치를 줄 수 있는 문자열 요소의 배열인 모든 필드를 포함할 수 있습니다. 텍스트 인덱스의 경우 인덱싱된 필드의 가중치는 텍스트 검색 점수 측면에서 다른 인덱싱된 필드와 관련된 필드의 중요성을 나타냅니다.

db.snippets.createIndex(
  {
    title: "text",
    tags: "text",
    "codeSnippets.comment": "text",
    "codeSnippets.code": "text",
    sourceUrl: "text"
  },
  {
    weights: {
      title: 8,
      tags: 13,
      "codeSnippets.comment": 3,
      "codeSnippets.code": 1,
      sourceUrl: 1
    },
    name: "full_text_search",
    default_language: "none",
    language_override: "none"
  }
);


문서의 각 인덱싱된 필드에 대해 MongoDB는 일치 항목 수에 가중치를 곱하고 결과를 합산합니다. 이 합계를 사용하여 MongoDB는 문서의 점수를 계산합니다. 그런 다음 아래 스니펫과 같이 텍스트 점수를 기준으로 반환 및 정렬하는 방법에 대한 자세한 내용을 보려면 $meta 연산자를 사용할 수 있습니다.

let getPublicBookmarksForSearchedTerms = async function (nonSpecialSearchTerms, page, limit, sort, specialSearchFilters, searchInclude) {

  let filter = {
    public: true
  }

  if ( nonSpecialSearchTerms.length > 0 ) {
    if(searchInclude === 'any') {
      filter.$text = {$search: nonSpecialSearchTerms.join(' ')}
    } else {
      filter.$text = {$search: bookmarksSearchHelper.generateFullSearchText(nonSpecialSearchTerms)};
    }
  }

  addSpecialSearchFiltersToMongoFilter(specialSearchFilters, filter);

  let sortBy = {};
  if ( sort === 'newest' ) {
    sortBy.createdAt = -1;
  } else {
    sortBy.score = {$meta: "textScore"}
  }

  let bookmarks = await Bookmark.find(
    filter,
    {
      score: {$meta: "textScore"}
    }
  )
    .sort(sortBy)
    .skip((page - 1) * limit)
    .limit(limit)
    .lean()
    .exec();

  return bookmarks;
}



Shared with ❤️ from Codever.   👉 use the copy to mine functionality to add it to your personal snippets collection.

좋은 웹페이지 즐겨찾기