언어 지원을 통한 MongoDb 텍스트 검색

Nov 22 2020

MongoDB의 언어 텍스트 검색에 문제가 있습니다. 일부 레코드의 경우 검색이 잘 작동하고 일부 레코드의 경우 전혀 작동하지 않습니다.

검색하고 싶은 재료 목록이 있습니다. 재료는 여러 언어로되어 있으며 단 복수를 관리하는 것을 좋아합니다.

여기 내 예가 있습니다.

개요

{
  translation: [
    {
      language: {
        type: String,
        required: true
      },
      name: {
        type: String,
        required: true
      }
    }
  ],
  calories: {
    "type": Number
  },
  protein: {
    "type": Number
  },
  carbohydrate: {
    "type": Number
  },
  fat: {
    "type": Number
  }
}

인덱스

foodSchema.index( { "translation.name": "text" }, { default_language: "german" } )

DB에서 인덱스 읽기

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_"
    },
    {
        "v" : 2,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "translation.name_text",
        "default_language" : "german",
        "background" : true,
        "weights" : {
            "translation.name" : 1
        },
        "language_override" : "language",
        "textIndexVersion" : 3
    }
]

기록

{
  calories: 1,
  protein: 2,
  carbohydrate: 3,
  fat: 4,
  translation: [
    {
      _id: ObjectId('5fba87d13ad6404108191670'),
      language: 'german',
      name: 'gurke'
    },
    {
      _id: ObjectId('5fba87d13ad6404108191671'),
      language: 'english',
      name: 'cucumber'
    },
    {
      _id: ObjectId('5fba87d13ad6404108191672'),
      language: 'spanish',
      name: 'pepino'
    }
  ]
}

// ----

{    
  calories: 4,
  protein: 3,
  carbohydrate: 2,
  fat: 1,
  translation: [
    {
      _id: ObjectId('5fba87d13ad6404108191674'),
      language: 'german',
      name: 'huhn'
    },
    {
      _id: ObjectId('5fba87d13ad6404108191675'),
      language: 'english',
      name: 'chicken'
    },
    {
      _id: ObjectId('5fba87d13ad6404108191676'),
      language: 'spanish',
      name: 'pollo'
    }
  ]
}

데이터 검색

db.getCollection('foods').find({$text: { $search: "gurke" }}) //works
db.getCollection('foods').find({$text: { $search: "gurken" }}) //works
db.getCollection('foods').find({$text: { $search: "cucumber" }}) //works
db.getCollection('foods').find({$text: { $search: "cucumbers" }}) //works
db.getCollection('foods').find({$text: { $search: "huhn" }}) //works
db.getCollection('foods').find({$text: { $search: "hühner" }}) //works
db.getCollection('foods').find({$text: { $search: "chicken" }}) // no result
db.getCollection('foods').find({$text: { $search: "chickens" }}) //no result
db.getCollection('foods').find({$text: { $search: "pepino" }}) //no result

MongoDb의 문서에 따르면 다음과 같습니다. https://docs.mongodb.com/manual/tutorial/specify-language-for-text-index/

인덱싱 된 데이터와 관련된 기본 언어는 어근 (즉, 형태소 분석)을 구문 분석하고 불용어를 무시하는 규칙을 결정합니다.

  • 기본 언어 만 지원된다는 의미입니까?
  • 오이에는 효과가 있지만 닭고기에는 효과가없는 이유는 무엇입니까?

나는 또한 어떤 닭의 불용어도 확인하고 있었다. https://github.com/mongodb/mongo/blob/master/src/mongo/db/fts/stop_words_english.txt

도와 주셔서 감사합니다!

답변

1 Minsky Nov 22 2020 at 17:06

문제는 색인이 아닙니다. 맞지만 $language기본 언어 를 추가 하거나 사용합니다 (적어도를 사용할 때 $text). 시험

 db.collection.find({$text:{$search:"pollo", $language:"spanish"}})

$language 문서

지정되지 않은 경우 검색은 색인의 기본 언어를 사용합니다.

또한 실행하면

 db.collection.find({$text:{$search:"pollo"}}).explain()

쿼리가 기본 언어를 사용하고 있음을 알 수 있습니다.