индекс текстового поиска по запросу для составного текстового поиска и метка времени mongodb - PullRequest
1 голос
/ 05 мая 2020

У меня есть коллекция, в которой содержится около 65 миллионов таких документов

    {
    "_id" : ObjectId("5e0b814660da38d499ecf178"),
    "brands" : null,
    "client_id" : null,
    "code_co_owner" : ",7359562, ",
    "code_segment" : "7359562",
    "core" : "",
    "created" : "01-01-2020",
    "created_full" : "01-01-2020 00:00:27",
    "created_int" : NumberLong(1577811627),
    "email" : ",phamthanhlam17_gmail_com, "
.....
}

Я сделал составной индекс по (email, created_int): {"email": text, created_int: - 1} для поиска и фильтрации, имя которой находится в диапазоне created_int. Но я вижу, что это низкая производительность при поиске.

Я попытался использовать объяснение по запросу:

    db.getCollection('profile_20201').explain().find({"$text":{"$search":"phamthanhlam17_gmail_com"},
"created_int":{"$lte":1585627013, "$gte":1583035013}}).count()

Результат объяснения :

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [ 
                {
                    "created_int" : {
                        "$lte" : 1585627013.0
                    }
                }, 
                {
                    "created_int" : {
                        "$gte" : 1583035013.0
                    }
                }, 
                {
                    "$text" : {
                        "$search" : "phamthanhlam17_gmail_com",
                        "$language" : "english",
                        "$caseSensitive" : false,
                        "$diacriticSensitive" : false
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "COUNT",
            "inputStage" : {
                "stage" : "TEXT",
                "indexPrefix" : {},
                "indexName" : "email_text_created_int_-1",
                "parsedTextQuery" : {
                    "terms" : [ 
                        "phamthanhlam17_gmail_com"
                    ],
                    "negatedTerms" : [],
                    "phrases" : [],
                    "negatedPhrases" : []
                },
                "textIndexVersion" : 3,
                "inputStage" : {
                    "stage" : "TEXT_MATCH",
                    "inputStage" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                            "stage" : "OR",
                            "filter" : {
                                "$and" : [ 
                                    {
                                        "created_int" : {
                                            "$lte" : 1585627013.0
                                        }
                                    }, 
                                    {
                                        "created_int" : {
                                            "$gte" : 1583035013.0
                                        }
                                    }
                                ]
                            },
                            "inputStage" : {
                                "stage" : "IXSCAN",
                                "keyPattern" : {
                                    "_fts" : "text",
                                    "_ftsx" : 1,
                                    "created_int" : -1.0
                                },
                                "indexName" : "email_text_created_int_-1",
                                "isMultiKey" : true,
                                "isUnique" : false,
                                "isSparse" : false,
                                "isPartial" : false,
                                "indexVersion" : 2,
                                "direction" : "backward",
                                "indexBounds" : {}
                            }
                        }
                    }
                }
            }
        },
        "rejectedPlans" : []
    },
    "serverInfo" : {
    },
    "ok" : 1.0
}

Это объясняет статистику:

    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "namespace",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [ 
                {
                    "created_int" : {
                        "$lte" : 1585627013.0
                    }
                }, 
                {
                    "created_int" : {
                        "$gte" : 1583035013.0
                    }
                }, 
                {
                    "$text" : {
                        "$search" : "phamthanhlam17_gmail_com",
                        "$language" : "english",
                        "$caseSensitive" : false,
                        "$diacriticSensitive" : false
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "COUNT",
            "inputStage" : {
                "stage" : "TEXT",
                "indexPrefix" : {},
                "indexName" : "email_text_created_int_-1",
                "parsedTextQuery" : {
                    "terms" : [ 
                        "phamthanhlam17_gmail_com"
                    ],
                    "negatedTerms" : [],
                    "phrases" : [],
                    "negatedPhrases" : []
                },
                "textIndexVersion" : 3,
                "inputStage" : {
                    "stage" : "TEXT_MATCH",
                    "inputStage" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                            "stage" : "OR",
                            "filter" : {
                                "$and" : [ 
                                    {
                                        "created_int" : {
                                            "$lte" : 1585627013.0
                                        }
                                    }, 
                                    {
                                        "created_int" : {
                                            "$gte" : 1583035013.0
                                        }
                                    }
                                ]
                            },
                            "inputStage" : {
                                "stage" : "IXSCAN",
                                "keyPattern" : {
                                    "_fts" : "text",
                                    "_ftsx" : 1,
                                    "created_int" : -1.0
                                },
                                "indexName" : "email_text_created_int_-1",
                                "isMultiKey" : true,
                                "isUnique" : false,
                                "isSparse" : false,
                                "isPartial" : false,
                                "indexVersion" : 2,
                                "direction" : "backward",
                                "indexBounds" : {}
                            }
                        }
                    }
                }
            }
        },
        "rejectedPlans" : []
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 0,
        "executionTimeMillis" : 1499057,
        "totalKeysExamined" : 72544123,
        "totalDocsExamined" : 39448083,
        "executionStages" : {
            "stage" : "COUNT",
            "nReturned" : 0,
            "executionTimeMillisEstimate" : 1483861,
            "works" : 72544124,
            "advanced" : 0,
            "needTime" : 72544123,
            "needYield" : 0,
            "saveState" : 578233,
            "restoreState" : 578233,
            "isEOF" : 1,
            "invalidates" : 0,
            "nCounted" : 39448083,
            "nSkipped" : 0,
            "inputStage" : {
                "stage" : "TEXT",
                "nReturned" : 39448083,
                "executionTimeMillisEstimate" : 1475831,
                "works" : 72544124,
                "advanced" : 39448083,
                "needTime" : 33096040,
                "needYield" : 0,
                "saveState" : 578233,
                "restoreState" : 578233,
                "isEOF" : 1,
                "invalidates" : 0,
                "indexPrefix" : {},
                "indexName" : "email_text_created_int_-1",
                "parsedTextQuery" : {
                    "terms" : [ 
                        "phamthanhlam17_gmail_com"
                    ],
                    "negatedTerms" : [],
                    "phrases" : [],
                    "negatedPhrases" : []
                },
                "textIndexVersion" : 3,
                "inputStage" : {
                    "stage" : "TEXT_MATCH",
                    "nReturned" : 39448083,
                    "executionTimeMillisEstimate" : 1473041,
                    "works" : 72544124,
                    "advanced" : 39448083,
                    "needTime" : 33096040,
                    "needYield" : 0,
                    "saveState" : 578233,
                    "restoreState" : 578233,
                    "isEOF" : 1,
                    "invalidates" : 0,
                    "docsRejected" : 0,
                    "inputStage" : {
                        "stage" : "FETCH",
                        "nReturned" : 39448083,
                        "executionTimeMillisEstimate" : 1465951,
                        "works" : 72544124,
                        "advanced" : 39448083,
                        "needTime" : 33096040,
                        "needYield" : 0,
                        "saveState" : 578233,
                        "restoreState" : 578233,
                        "isEOF" : 1,
                        "invalidates" : 0,
                        "docsExamined" : 39448083,
                        "alreadyHasObj" : 0,
                        "inputStage" : {
                            "stage" : "OR",
                            "filter" : {
                                "$and" : [ 
                                    {
                                        "created_int" : {
                                            "$lte" : 1585627013.0
                                        }
                                    }, 
                                    {
                                        "created_int" : {
                                            "$gte" : 1583035013.0
                                        }
                                    }
                                ]
                            },
                            "nReturned" : 39448083,
                            "executionTimeMillisEstimate" : 439664,
                            "works" : 72544124,
                            "advanced" : 39448083,
                            "needTime" : 33096040,
                            "needYield" : 0,
                            "saveState" : 578233,
                            "restoreState" : 578233,
                            "isEOF" : 1,
                            "invalidates" : 0,
                            "dupsTested" : 72544123,
                            "dupsDropped" : 0,
                            "recordIdsForgotten" : 0,
                            "inputStage" : {
                                "stage" : "IXSCAN",
                                "nReturned" : 72544123,
                                "executionTimeMillisEstimate" : 291188,
                                "works" : 72544124,
                                "advanced" : 72544123,
                                "needTime" : 0,
                                "needYield" : 0,
                                "saveState" : 578233,
                                "restoreState" : 578233,
                                "isEOF" : 1,
                                "invalidates" : 0,
                                "keyPattern" : {
                                    "_fts" : "text",
                                    "_ftsx" : 1,
                                    "created_int" : -1.0
                                },
                                "indexName" : "email_text_created_int_-1",
                                "isMultiKey" : true,
                                "isUnique" : false,
                                "isSparse" : false,
                                "isPartial" : false,
                                "indexVersion" : 2,
                                "direction" : "backward",
                                "indexBounds" : {},
                                "keysExamined" : 72544123,
                                "seeks" : 1,
                                "dupsTested" : 72544123,
                                "dupsDropped" : 0,
                                "seenInvalidated" : 0
                            }
                        }
                    }
                }
            }
        }
    },
    "serverInfo" : {
    },
    "ok" : 1.0
}```

So, is the index is cover the query?

Or which index will give me better performance for this problem?

Thank you.

1 Ответ

1 голос
/ 06 мая 2020

Ну, похоже, вы создали составной индекс с text. Но в официальной документации MongoDB говорится, что:

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

  • Составной текстовый индекс не может включать какие-либо другие специальные типы индексов, такие как поля с несколькими ключами или геопространственными индексами.
  • Если составной индекс текстовый индекс включает ключи, предшествующие ключу текстового индекса, чтобы выполнить поиск $ text, предикат запроса должен включать условия совпадения по предыдущим ключам. (здесь вы используете запрос диапазона)
  • При создании составного текстового индекса все ключи текстового индекса должны быть перечислены рядом в документе спецификации индекса.

Итак, это первая проблема.


Затем я хочу, чтобы вы взглянули на префиксы , это поможет вам понять, как составные индексы будут использоваться в вашем запросе.

Надеюсь это поможет вам разобраться в проблеме :)

...