【问题标题】:MongoDB: Index strategy for elastic search (collation and strength)MongoDB:弹性搜索的索引策略(排序和强度)
【发布时间】:2020-12-11 22:41:42
【问题描述】:

我正在使用 MongoDB,并且有一个非常小的文档集合,这里是:

name: 'Always en_GB locale, default name',
ticker: 'Derivative short name from the name field. Like if my full name is Aleksandr, then ticker will be Sasha'
name_locale: 'This field has a string in different locales, sometimes it\'s Cyrillic, sometimes it\'s Spanish',
locale: 'en_GB', //or 'en_US', it shows the locale of name_locale field
region 'Europe', //or North America, it doesn't matter in that case

所有这些字段都是String 类型。

另外,我有一个 API 端点,我想接收一个参数,它可以是这些字段的任何值。所以它可能是param=Europeparam=en_GBparam=name_locale_value

那么,在这种情况下,我需要一个文本索引,对吗?我有它。

schema.index(
  { name: 'text', name_locale: 'text', ticker: 'text', region: 'text' },
  { name: 'SearchQuery' },
);

但您可能会注意到,我没有任何排序规则和强度值。所以问题是:

如何使用strength: 1like in this answer 进行不区分大小写的搜索,如果我还需要包含/搜索具有不同语言字符串值的name_locale 字段?

文档示例:

{
  name: 'Aleksandr,
  ticker 'Sasha',
  name_locale: 'Саша',
  locale: 'ru_RU',
  region: 'Europe',
},{
  name: 'Jonathan',
  ticker 'John',
  name_locale: 'Jonathan',
  locale: 'en_US',
  region: 'North America',
}
await collection.find(
          { $text: { $search: QueryValue } }, //QueryValue = 'europe'
          { score: { $meta: 'textScore' } },
        )
  • 是否需要构建多个单字段索引?并使用$or 运算符查找所有字段。
  • 或者Mongo 4.4 中的text 索引是否支持strength 而没有locale
  • 也许还有另一种通用方式,例如将.find 与正则表达式一起使用?如果您能提供一些建议,我将不胜感激。

【问题讨论】:

    标签: mongodb mongoose mongodb-query mongoosastic


    【解决方案1】:

    “不区分大小写”的含义是特定于语言环境的。这意味着当您进行查询时,您需要知道查询所使用的语言,以便能够以不区分大小写的方式通过该查询进行搜索。

    鉴于此,我将创建另一个字段,其中包含来自特定于区域设置的字段的小写文本,由您的应用程序在知道每个字段值所在的语言的情况下小写,然后使用“简单”区域设置执行二进制比较小写查询(在您的应用程序中也使用小写查询,并且知道查询所使用的语言)适用于任何语言。这样你应该可以只使用一个文本索引。

    此解决方案不会为您提供词干,如果您想要词干,我想您需要为可能用于查询的每种语言定义一个索引。

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 2013-07-25
      • 2013-09-16
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2021-08-17
      • 2016-10-24
      相关资源
      最近更新 更多