Монго: текстовый поиск с регулярным выражением - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть коллекция с именем test со следующими данными:

> db.test.find()
{ "_id" : ObjectId("5ae3494a5daab479a87f51fb"), "a" : "a6", "b" : "b6", "c" : "c6", "__key" : "default-domain:admin:vn1;c8" }
{ "_id" : ObjectId("5ae349645daab479a87f51fc"), "a" : "a7", "b" : "b7", "c" : "c7", "__key" : "default-domain:admin:vn2;c9" }
{ "_id" : ObjectId("5ae349af5daab479a87f51fd"), "a" : "a0", "b" : "b0", "c" : "c0", "__key" : "a0;b0;c0" }
{ "_id" : ObjectId("5ae349be5daab479a87f51fe"), "a" : "a1", "b" : "b1", "c" : "c1", "__key" : "a1;b1;c1" }
{ "_id" : ObjectId("5ae349cc5daab479a87f51ff"), "a" : "a2", "b" : "b1", "c" : "c2", "__key" : "a2;b2;c2" }
{ "_id" : ObjectId("5ae349d75daab479a87f5200"), "a" : "a3", "b" : "b2", "c" : "c3", "__key" : "a3;b3;c3" }
{ "_id" : ObjectId("5ae34b6c5daab479a87f5201"), "a" : "a8", "b" : "b8", "c" : "c9", "__key" : "default-domain:vn9;ch9" }
> 

Я установил индекс, как показано ниже:

db.test.createIndex({__key: "text"})

Теперь я хочу найти строку с ключами, имеющими default-domain:*c8

> db.test.find({$text: {$search: "/default-domain:*c8/"}})
{ "_id" : ObjectId("5ae3494a5daab479a87f51fb"), "a" : "a6", "b" : "b6", "c" : "c6", "__key" : "default-domain:admin:vn1;c8" }
{ "_id" : ObjectId("5ae34b6c5daab479a87f5201"), "a" : "a8", "b" : "b8", "c" : "c9", "__key" : "default-domain:vn9;ch9" }
{ "_id" : ObjectId("5ae349645daab479a87f51fc"), "a" : "a7", "b" : "b7", "c" : "c7", "__key" : "default-domain:admin:vn2;c9" }
> 

Таким образом, он возвращает неправильные данные, я ожидал, чтобы вернуть только

{ "_id" : ObjectId("5ae3494a5daab479a87f51fb"), "a" : "a6", "b" : "b6", "c" : "c6", "__key" : "default-domain:admin:vn1;c8" }

Я вижу из объяснения ()

    "winningPlan" : {
        "stage" : "TEXT",
        "indexPrefix" : {

        },
        "indexName" : "__key_text",
        "parsedTextQuery" : {
            "terms" : [
                "c8",
                "default",
                "domain"
            ],
            "negatedTerms" : [ ],
            "phrases" : [ ],
            "negatedPhrases" : [ ]
        },

Так вот, внутренне оно преобразуется в 3 слова:

            "terms" : [
                "c8",
                "default",
                "domain"
            ],

Я думаю, именно поэтому он возвращает неправильные данные.

Итак, как мне добиться этого с помощью текстового индекса: db.test.find({$text: {$search: "??"}}) Неправильно ли найдено поисковое выражение?

С уважением, -M-

1 Ответ

0 голосов
/ 28 апреля 2018

Текстовый индекс работает так, как ожидается, так как он токенизирует и связывает термин в индексе. Это объясняет, почему поисковый термин разделен на три отдельных слова в вашем плане объяснения.

См. https://docs.mongodb.com/manual/core/index-text/#tokenization-delimiters для токенизации и https://docs.mongodb.com/manual/core/index-text/#index-entries для основополагающих и стоп-слов.

Если вам требуется, чтобы «default-domain» был в начале при запросе «c8», то вы можете рассмотреть регистр-префиксное выражение с учетом регистра https://docs.mongodb.com/manual/reference/operator/query/regex/#index-use и использование «$» для захватите "c8" в конце вашего регулярного выражения http://grainge.org/pages/authoring/regex/regular_expressions.htm.

Кроме того, вы можете проанализировать значения из поля "_key", чтобы сохранить соответствующие данные и напрямую запросить необходимые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...