2016-09-20 2 views
1

Предположим, что у меня есть образец структуры БДMongoDB вес полнотекстового индекса подстановочные

[ 
    { name: 'hello world', description: { key: 'something' } }, 
    { name: 'user', description: { key: 'hello world' } }, 
] 

с индексом

db.fulltext.createIndex({ name: 'text', '$**': 'text' }, { weights: { name: 10, '$**': 5 } }) 

Я найти документы с запросом

db.fulltext.find({ $text: { $search: 'hello world' } }, { score: { $meta: 'textScore' } }) 

Но ... Это дает я оценил 15.0 для обоих документов ... Нельзя добавить вес к подстановочному оператору? Почему второй документ умножает счет от name?

ответ

2

Подстановочный индекс "$**" включает все строковые поля в документе в текстовом индексе. В приведенном выше сценарии имя представляет собой строковый атрибут, для которого вес был задан как 10, и в целом вес всех строковых полей был назначен как 5 (включая поле имени, так как используется дикая карта). Таким образом, вес переопределяется.

Когда текстовый поиск завершен, для всех полей String задан одинаковый вес. Таким образом, оценка одинакова для обоих документов, так как нет никакого относительного значения для других проиндексированных полей (то есть, поскольку дикая карта использовалась при создании индекса).

Оператор $ text присваивает оценку каждому документу, содержащему поисковый запрос в индексированных полях. Оценка представляет собой релевантность документа к данному текстовому поисковому запросу.

Когда требуется различный вес для разных полей, вам необходимо указать имена полей при создании индекса. Другими словами, вы не должны указывать вес для поля String и включать вес дикой карты для всех строковых полей. Очевидно, один вес будет переопределять другой.

Если вы можете изменить индекс, как указано ниже, вы можете увидеть разницу.

Создать индекс: -

db.fulltext.createIndex({ name: 'text', 'description.key' : 'text' }, { weights: { name: 10, 'description.key' : 5 } }) 

Поиск: -

db.fulltext.find({ $text: { $search: 'hello world' } }, { score: { $meta: 'textScore' } }) 

Результат: -

{ 
    "_id" : ObjectId("57e119cbf522cc85b5595797"), 
    "name" : "hello world", 
    "description" : { 
     "key" : "something" 
    }, 
    "score" : 15 
} 

{ 
    "_id" : ObjectId("57e119cbf522cc85b5595798"), 
    "name" : "user", 
    "description" : { 
     "key" : "hello world" 
    }, 
    "score" : 7.5 
} 
Смежные вопросы