Текстовый поиск MongoDB $ не возвращает ожидаемых результатов - PullRequest
0 голосов
/ 17 января 2020

Я создал текстовый индекс на основе полей title и main_body в своей коллекции Mon go. Например, у меня есть статья с заголовком «Эбби Бенгтссон» и ее именем «Эбби», которая появляется в тексте статьи в main_body.

. При выполнении запроса текстового поиска: {$text: {$search: 'abby bengtsson'}} возвращает желаемое статья, а также еще пара. enter image description here

Но простой запрос ее имени: {$text: {$search: 'abby'}} ничего не возвращает. enter image description here

Я пытался использовать Mon go Compass, Downloaded Studio 3T и использовать s sh и команды терминала на сервере напрямую. enter image description here

Но я не понимаю, почему это происходит .. То же самое касается других ключевых слов в других статьях.

JSON Do c пример

{
"_id" : ObjectId("5e0f4ded35fbd16f21bf3655"), 
    "category" : {
        "category_id" : "5010", 
        "slug" : {
            "0010" : "profiler", 
            "0020" : "profiler", 
            "0030" : "profiler"
        }, 
        "label" : {
            "0010" : "Profiler", 
            "0020" : "Profiler", 
            "0030" : "Profiler"
        }, 
        "bg_color" : "#B12CA6", 
        "txt_color" : "#ffffff", 
        "main_category_id" : "5000"
    }, 
    "featured_image" : {
        "main" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg", 
        "mobile" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg", 
        "square" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg"
    }, 
    "metadata" : {
        "title" : "Abby Bengtsson", 
        "description" : "Hon sprudlar av energi och glädje, vilket smittar av sig på hela redaktionen när hon kliver in hos En Sueco. Med sig har hon sin ursöta följeslagare pomeranianen Melwin", 
        "og" : {
            "title" : "Abby Bengtsson", 
            "description" : "Hon sprudlar av energi och glädje, vilket smittar av sig på hela redaktionen när hon kliver in hos En Sueco. Med sig har hon sin ursöta följeslagare pomeranianen Melwin", 
            "image" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg", 
            "type" : "article", 
            "site_name" : "En Sueco", 
            "url" : "https://www.ensueco.com/profil-abby-bengtsson"
        }, 
        "twitter" : {
            "title" : "Abby Bengtsson", 
            "description" : "Hon sprudlar av energi och glädje, vilket smittar av sig på hela redaktionen när hon kliver in hos En Sueco. Med sig har hon sin ursöta följeslagare pomeranianen Melwin", 
            "card" : "summary", 
            "image" : "https://img.norrbom.com/article/5e0f4d5e35fbd16f21bf3653/78805a221a988e79ef3f42d7c5bfd418-1578061277668/abby.jpg"
        }
    }, 
    "tags" : [

    ], 
    "title" : "Abby Bengtsson", 
    "state" : NumberInt(1), 
    "created" : ISODate("2020-01-01T04:17:00.000+0000"), 
    "modified" : ISODate("2020-01-01T08:27:54.000+0000"), 
    "version" : NumberInt(19), 
    "featured" : false, 
    "language" : "sv", 
    "magazines" : [

    ], 
    "slug" : "profil-abby-bengtsson", 
    "published" : ISODate("2020-01-02T10:14:00.000+0000"), 
    "published_until" : null, 
    "author_alias" : "Text: Sara Laine, sara@norrbom.com Foto: Mugge Fischer, mugge@norrbom.com", 
    "main_body" : "... stringified JSON object with article ...", 
    "article_id" : ObjectId("5e0f4d5e35fbd16f21bf3653"), 
    "origin" : "cms", 
    "site" : "0020", 
    "__v" : NumberInt(0)
}

РЕДАКТИРОВАТЬ 18-01-2020

Я только что проверил что-то. Похоже, что эта проблема возникает только для документов, в которых для свойства language установлено значение sv (Swedi sh согласно MongoDB Language Documentation ). Если я изменю значение на da (Dani sh), документ будет возвращен при поиске «Abby».

В настоящее время я решил свою проблему в работе, установив language_overwrite в фиктивное поле, которое не существует .. Теперь все поля возвращаются, как они должны. Но то, что связано с языковым полем swedi sh, все еще смущает меня, поскольку это ТОЛЬКО когда я выбираю поле "sv" - и какой смысл иметь многоязычные документы и текстовый индекс, который предположительно должен возвращаться и поиск по локали, если он не работает для одной конкретной языковой переменной?

1 Ответ

1 голос
/ 17 января 2020

Какую версию MongoDB вы используете? Функциональность немного изменилась от версии к версии. См. https://docs.mongodb.com/manual/core/index-text/#versions для получения более подробной информации.

Я проверил это в 4.2 и получил ожидаемые результаты.

Чтобы проверить это, я создал бесплатный кластер в Atlas (cloud.mongodb.com) и загрузил данные примера. Затем я перешел на вкладку «Коллекции». Пример данных содержит базу данных с именем «sample_mflix» с коллекцией, называемой «фильмы». В моей коллекции был текстовый индекс по умолчанию, охватывающий следующие поля: cast_text_fullplot_text_genres_text_title_text.

Затем я перешел на вкладку Поиск. Когда я запустил описанные вами поиски, я получил результаты, которые вы ожидаете. {$ Text: {$ search: 'abby bengtsson'}} и {$ text: {$ search: 'abby'}} возвращают много результатов

Обновление на основе новой информации, добавленной к исходному вопросу 18-01-20

Я говорил с коллегой, который объяснил мне, что происходит:

Стоит отметить, что текстовый поиск предназначен для использования в эвристике языка. Это приведет к неожиданным результатам с собственными существительными, такими как «Abby» (и с многоязычным поиском).

Используя вывод объяснения запроса для понимания, вот что происходит: - Эбби связана с Эбби в Swedi sh но abbi в Engli sh, поэтому термин индексируется как abby, учитывая значение языка sv в документе. - Для поиска без какого-либо языка по умолчанию будет использоваться Engli sh (вместо того, чтобы пытаться выполнить поиск на всех возможных языках), поэтому поиск по умолчанию не будет соответствовать индексируемому термину.

Для поиска, соответствующего индексируемому языку, он будет иметь предоставить значение языка, например: db.articles.find ({$ text: {$ search: 'abby', $ language: 'sv'}}).

Это работает, как задумано, но не ' не соответствует ожиданиям пользователя, что запросы будут сопоставляться со всеми возможными языками (что, вероятно, является бесполезным результатом с точки зрения релевантности).

На самом деле они хотят получить решение, к которому они пришли: они должны индексировать с помощью язык не для простого токенизации без использования стволовых слов или стоп-слов.

...