mongodb 如何为西班牙语lang正确设置不区分变音符号的$text索引

qjp7pelc  于 2023-05-17  发布在  Go
关注(0)|答案(1)|浏览(124)

我正在努力寻找如何为我的person集合正确地设置一个不区分变音符号的文本索引。这是一个没有整理的普通集合。
MongoDB版本是5.0.15
我需要一个文本索引(不使用mongo atlas)的名称和familyName字段。我用这个配置创建了一个索引:

{
  "v": 2,
  "key": {
    "_fts": "text",
    "_ftsx": 1
  },
  "name": "personsFullname",
  "weights": {
    "familyName": 1,
    "name": 1
  },
  "default_language": "es",
  "language_override": "language",
  "textIndexVersion": 3
}

问题是,即使MongoDB手册说,从版本3开始,文本搜索对变音符号不敏感,但它并不是这样工作的。或者至少我不确定这个版本是指prop "v": 2还是"textIndexVersion": 3
假设我有这三条记录:

[
  {
    "_id": "aaaaaaa",
    "name": "Roberto ",
    "familyName": "Torres García "
  },
  {
    "_id": "bbbbbbb",
    "name": "Ruben A",
    "familyName": "Parras García"
  },
  {
    _id:"ccccc",
    "name": "Karla",
    "familyName": "Rosas García"
  }
]

如果我搜索García(使用变音符号表示i):

db.getCollection("personsData").find({ "$text": { "$search": "García" } })

它找到3条记录。
但是如果我搜索Garcia(不使用变音符号表示i):

db.getCollection("personsData").find({ "$text": { "$search": "Garcia" } })

它找不到任何记录。
我错过了什么?
任何帮助或提示都非常感谢。
先谢谢你。

ibrsph3r

ibrsph3r1#

@rickhg12hs建议:

  • 如果我在本地测试,在mongo版本6.0.5上工作,如果我不设置 *default_language:西班牙语 *
db.consultas.createIndex(
  { diagnostico: "text" },
);

在网上 mongoPlayground,正如@rickhg12hs指出的那样,是这样工作的:
操场链接:https://mongoplayground.net/p/P6TVAR8T1oU
如果你想在本地示例中重现这个例子(我使用的是docker 6.0.5):

use("clinica");

db.consultas.insertMany([
  {
    nombre: "Juan Perez",
    especialidad: "general",
    diagnostico: "Dolor abdominal, Fiebre alta, tos, posible caso de COVID",
  },
  {
    nombre: "María Pelaez",
    especialidad: "general",
    diagnostico: "Tensión alta, posible episodio de ataque de ansiedad",
  },
  {
    nombre: "Javier Garcia",
    especialidad: "cardiología",
    diagnostico: "Arritmias, acompañado de tensión alta, enfermería",
  },
  {
    nombre: "Manuel Gómez",
    especialidad: "general",
    diagnostico: "Fiebre alta, tos y mucosidades, enfermería",
  },
]);

创建索引

db.consultas.createIndex(
  { diagnostico: "text" },
);

启动查询(您可以尝试 enfermeríaenfermeria 两个选项,您将获得结果

db.consultas.find({ $text: { $search: "enfermeria" } });

我不需要去听那个详细的版本
我在其他帖子上读到尝试

版本6似乎不需要此内容

db.consultas.createIndex(
  { diagnostico: "text" },
  {
    defaultLanguage: "es",
    textIndexVersion: 3,
  }
);

并且在查询中指示忽略变音符号:

db.consultas.find({
  $text: {
    $search: "enfermeria",
    $diacriticSensitive: false,
  },
});

相关问题