MongoDB:弹性搜索的索引策略(排序和强度)

时间:2020-08-22 22:10:13

标签: mongodb mongoose mongodb-query mongoosastic

我使用的是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: 1字段进行包含/搜索,该字段具有不同语言的字符串值,那么如何使用name_localelike in this answer进行不区分大小写的搜索?

文档示例:

{
  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与Regexp一起使用?如果您分享一些建议,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

鉴于此,我将创建另一个字段,其中包含特定于语言环境的字段中的小写文本,由应用程序将其小写,并了解每个字段值所用的语言,然后使用“简单”语言环境对它进行二进制比较小写查询(在知道查询所用语言的情况下在应用程序中也小写)将适用于任何语言。这样,您应该只能使用一个文本索引。

此解决方案无法解决问题,如果您想进行研究,我想您需要为每种可能用于查询的语言定义一个索引。