MongoDB:elasticsearch的索引策略(collation and strength)
MongoDB: Index strategy for elastic search (collation and strength)
我正在使用 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=Europe
或 param=en_GB
或 param=name_locale_value
.
所以,在那种情况下,我需要一个文本索引,对吗?我有。
schema.index(
{ name: 'text', name_locale: 'text', ticker: 'text', region: 'text' },
{ name: 'SearchQuery' },
);
但是您可能会注意到,我没有任何排序规则和强度值。所以问题是:
How to make case-insensitive searches, with strength: 1
, like in this answer, if I also need to include/search by name_locale
field, that has string values in different languages?
文档示例:
{
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
索引是否支持没有 locale
的 strength
?
- 也许还有另一种通用方法,比如使用
.find
和 Regexp?如果您分享一些建议,我将不胜感激。
“case-insensitive”的意思是locale-specific。这意味着当您查询时,您需要知道查询使用的是什么语言,以便能够以 case-insensitive 方式通过该查询进行搜索。
鉴于此,我将创建另一个字段,其中包含来自您的 locale-specific 字段的小写文本,由您的应用程序根据每个字段值使用的语言进行小写,然后使用“简单”语言环境执行与适用于任何语言的小写查询(在您的应用程序中也小写,知道查询使用的语言)的二进制比较。这样你应该可以只使用一个文本索引。
此解决方案不提供词干提取,如果您想要词干提取,我想您需要为可能用于查询的每种语言定义一个索引。
我正在使用 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=Europe
或 param=en_GB
或 param=name_locale_value
.
所以,在那种情况下,我需要一个文本索引,对吗?我有。
schema.index(
{ name: 'text', name_locale: 'text', ticker: 'text', region: 'text' },
{ name: 'SearchQuery' },
);
但是您可能会注意到,我没有任何排序规则和强度值。所以问题是:
How to make case-insensitive searches, with
strength: 1
, like in this answer, if I also need to include/search byname_locale
field, that has string values in different languages?
文档示例:
{
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
索引是否支持没有locale
的strength
? - 也许还有另一种通用方法,比如使用
.find
和 Regexp?如果您分享一些建议,我将不胜感激。
“case-insensitive”的意思是locale-specific。这意味着当您查询时,您需要知道查询使用的是什么语言,以便能够以 case-insensitive 方式通过该查询进行搜索。
鉴于此,我将创建另一个字段,其中包含来自您的 locale-specific 字段的小写文本,由您的应用程序根据每个字段值使用的语言进行小写,然后使用“简单”语言环境执行与适用于任何语言的小写查询(在您的应用程序中也小写,知道查询使用的语言)的二进制比较。这样你应该可以只使用一个文本索引。
此解决方案不提供词干提取,如果您想要词干提取,我想您需要为可能用于查询的每种语言定义一个索引。