Сравните полные и половинные японские символы в mongodb, используя параметры сортировки и регулярные выражения - PullRequest
1 голос
/ 11 октября 2019

В соответствии с документацией MongoDB и документации ICU должна быть возможность игнорировать разницу в ширину и половину ширины в японском тексте, используя collation.

Я попробовал следующее:

{ locale: "ja", caseLevel:true, strength:1} 

с разной силой, но ни один из них не работает.

db.getCollection('mycollection')
        .find({"desc":/バンド/})
        .collation({ locale: "ja", caseLevel:true, strength:1})

Этот запрос не может получить результат из следующего документа;

{
    "desc": "*EGRパイプバンド外れ"
}

обновление

Обнаружена причина, по которой в MongoDB регулярное выражение не может применять параметры сортировки, поэтому, если я использую определенное совпадение для выполнения запроса, результат будет идеальным:

db.getCollection('mycollection')
        .find({"desc":"*EGRパイプバンド外れ???"})
        .collation({ locale: "ja", caseLevel:true, strength:1})

Этот запрос вернет *EGRパイプバンド外れ этот результат.

Но нет, если я использую регулярное выражение, какие-либо предложения по нему?

1 Ответ

1 голос
/ 15 октября 2019

Невозможно заставить collate работать с любой логикой регулярного выражения find, поскольку скрипт регулярного выражения будет переопределять любое определение collate и использовать только логику, определенную внутри себя, а именно найти любую строку, содержащую половинутолько ширина バンド

Самый простой способ добиться этого - добавить дополнительную логику перед отправкой текста поиска в клиент MongoDB и дублировать текст как на половину, так и на всю ширину. Вы можете использовать какой-нибудь существующий инструмент, например this .

, а затем применить параметры поиска как половинной, так и полной ширины к своему find условию $or;

db.mycollection.find({$or: [{"desc":/バンド/}, {"desc":/バンド/}]}) 

Та же проблема;

...