Текстовый поиск — mongodb

Я использую текстовый поиск монго в своем приложении.

Индекс:

db.test.createIndex(
    {
        title: 'text',
        description: 'text'
    },
    {
        name: "TextIndex",
        weights: {
           title: 10,
           description: 1
        }
    }
)

Счет:

title : 10
description : 1

Документ:

db.test.insert(
  [
    { _id: 1, title: "agent de production", description: "production or agent"},
    { _id: 2, title: "agent test production", description: "agent" },
    { _id: 3, title: "production agent", "description" : "production"},
    { _id: 4, title: "agent", "description" : "production"},
    { _id: 5, title: "test", "description" : "production example agent"},
  ]
)

Вопрос

Итак, если я ищу "производство агентов"

Результат должен быть

[
  { _id: 1, title: "agent de production", description: "production or agent"},
  { _id: 2, title: "agent test production", description: "agent" },
  { _id: 3, title: "production agent", "description" : "production"},
  { _id: 5, title: "test", "description" : "production example agent"},
]

Что я пробовал:

db.test.find({"$text" : {"$search" : "\"agent production\""}}); Query result does not match with the expected result.

Результат: ноль

Фраза запроса : db.test.find({"$text" : {"$search" : "\"агент\" \"производство\""}})

Результат :

{ "_id" : 5, "title" : "test", "description" : "production example agent" }
{ "_id" : 1, "title" : "agent de production", "description" : "production or agent" }
{ "_id" : 3, "title" : "production agent", "description" : "production" }
{ "_id" : 2, "title" : "agent test production", "description" : "agent" }
{ "_id" : 4, "title" : "agent", "description" : "production" }

Любое предложение будет благодарен.


person karthick    schedule 17.02.2016    source источник
comment
Пробовали ли вы указать фразу для каждого отдельного термина, например db.test.find({"$text" : {"$search" : "\"agent\" \"production\""}});?   -  person chridam    schedule 17.02.2016
comment
@chridam да, снова это не дает ожидаемого результата.   -  person karthick    schedule 17.02.2016
comment
Нам нужно увидеть, что произойдет. неожидаемый результат может быть любым: от нуля до всех документов.   -  person Markus W Mahlberg    schedule 17.02.2016
comment
Я не понимаю. Второй результат был ожидаем. Документ, содержащий обе поисковые фразы, возвращается правильно. Может быть, вы должны добавить то, что вы ожидаете?   -  person Markus W Mahlberg    schedule 17.02.2016


Ответы (1)


Давайте рассмотрим, как работает строка $search в запросе $text. Если задана фраза, как в "$search": "\"agent production\"", только документы с проиндексированными полями, совпадающими с фразой, получают ненулевую оценку. Это объясняет, почему в данном случае не было найдено никаких результатов. Однако указание "$search": "\"production agent\"" будет соответствовать документу с _id: 3. Если даны отдельные слова/термины, как в "$search": "\"agent\" \"production\"", любой документ с проиндексированными полями, соответствующими любому из терминов, получает оценку. Это объясняет, почему документ с _id: 4 возвращается, поскольку в нем есть отдельные термины, не обязательно оба термина в одном поле, как вы показали в желаемом результате.

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

db.test.find( { $and: [ { "$text": { "$search": "\"agent\" \"production\"" } },
    { $or: [
        { $and: [ { title: /agent/i }, { title: /production/i } ] }, 
        { $and: [ { description: /agent/i }, { description: /production/i } ] }
    ] }
 ] }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )

Обратите внимание, что textScore добавляется, потому что по умолчанию документы не сортируются на основе оценки.

person logan rakai    schedule 18.02.2016