본문 바로가기
반응형
Data/NoSQL

[MongoDB] $text 검색 시 'No query solutions' 오류

by JAMINS 2023. 10. 27.

특정 단어나 문장을 검색하기 위해 컬렉션내에 필드 하나를 text 인덱스 추가하여 검색하려고 할 때, 보통 아래와 같이 쿼리한다.

db.getCollection('my_collection').find({ $text: { $search: "\"hello world\"" } })

위와 같이 단일 쿼리를 할 때는 괜찮지만, 다른 필드와 $or를 같이 쓰려한다면 다음과 같은 오류가 나타날 수 있다. 이번 케이스도 다른 필드와 조합하여 검색하려고 아래와 같은 쿼리로 검색을 시도하였으나, No query solutions 오류가 발생하였다.

검색 쿼리

db.getCollection('my_collection').find(
  "$or": [
    {
      "id": "hello world"
    }, {
      $text: {
        $search: "\"hello world\""
      }
    }
  ]
)

오류 메시지

MongoServerError: Encountered non-retryable error during query :: caused by :: error processing query: ns=cloud.masterDocument limit=10Tree: $and
    $or
        otherIds $elemMatch (obj)
            $and
                type $eq "DOI"
                id regex /^cannot be done 123$/i
        _id $eq "CANNOT BE DONE 123"
        normalizeTitle $eq "cannotbedone123"
        TEXT : query="cannot be done 123", language=english, caseSensitive=0, diacriticSensitive=0, tag=NULL
    customerCode $eq "EWHA"
Sort: {}
Proj: {}
 No query solutions
    at Connection.onMessage (/Users/user/_work/cloud-api/node_modules/mongodb/src/cmap/connection.ts:393:20)
    at MessageStream.<anonymous> (/Users/user/_work/cloud-api/node_modules/mongodb/src/cmap/connection.ts:224:56)
    at MessageStream.emit (node:events:513:28)
    at processIncomingData (/Users/user/_work/cloud-api/node_modules/mongodb/src/cmap/message_stream.ts:189:12)
    at MessageStream._write (/Users/user/_work/cloud-api/node_modules/mongodb/src/cmap/message_stream.ts:70:5)
    at writeOrBuffer (node:internal/streams/writable:391:12)
    at _write (node:internal/streams/writable:332:10)
    at MessageStream.Writable.write (node:internal/streams/writable:336:10)
    at Socket.ondata (node:internal/streams/readable:754:22)
    at Socket.emit (node:events:513:28) {
  ok: 0,
  code: 291,
  codeName: 'NoQueryExecutionPlans',
  operationTime: new Timestamp({ t: 1698387178, i: 1 }),
  '$clusterTime': {
    clusterTime: new Timestamp({ t: 1698387179, i: 3 }),
    signature: {
      hash: new Binary(Buffer.from("85dba58afc119a823857e0938f3afafb4f299d48", "hex"), 0),
      keyId: new Long("7238484426068328449")
    }
  },
  [Symbol(errorLabels)]: Set(0) {}

MongoDB 공식 문서에 보면 $text 사용에 대한 제약사항에 대해서 다음과 같이 나와있었다. (https://www.mongodb.com/docs/manual/reference/operator/query/text/#restrictions)

To use a $text query in an $or expression, all clauses in the $or array must be indexed.

여러가지 사항들 중에 or 연산과 함께 사용하려면 해당 필드 전부를 인덱스가 되어야만 한다는 문구가 나온다. 위 쿼리에서 id필드에는 인덱스가 걸려있지 않았다. 인덱스를 추가해서 재쿼리한 결과 정상 수행됨을 확인할 수 있었다. 이외에도 여러가지 제약사항들이 나오는데 $text 구문으로 쿼리할 때 참고하면 좋아보인다.

'Data > NoSQL' 카테고리의 다른 글

NoSQL 데이터 모델링 기법  (0) 2016.06.14
NoSQL 데이터 모델링 개념  (1) 2016.06.10
NoSQL의 특징 #2  (2) 2016.06.07
NoSQL의 특징 #1  (0) 2016.06.06

댓글