2014-10-18 2 views
0

Как создать индекс для поиска, основанный на значениях, которые не являются строками? Например:MongoDB: индекс текста включает в себя нестроковые типы данных

> db.people.ensureIndex({age: 'text', first_name: 'text', last_name:'text', _id:'text'}) 
> db.people.insert({age: 27, first_name:"Freddie", last_name: "Mercury"}) 

> db.people.find()[0] 
{ "_id" : ObjectId("5441ebe78fe20d0fae7b05b6"), "age" : 27, "first_name" : "Freddie", "last_name" : "Mercury" }) 

> db.people.find({$text: {$search: '5441ebe78fe20d0fae7b05b6'}}) 
(no results) 
> db.people.find({$text: {$search: '27'}}) 
(no results) 

Я хотел бы создать поисковый индекс, основанный на несколько ключей, но некоторые из них являются NumberLong, ObjectId и т.д. $ поиска требует строки. Клиент также может отправить запрос, например "27 Freddie". Могу ли я заставить индекс передавать все значения в строки, ради этого индексирования/поиска?

ответ

0

Мне кажется странным, что кто-то использовал бы термин «27 Freddie» в качестве поискового запроса, и я предпочел бы предоставить пользователю различные поля: возраст, имя, фамилию.

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

{ 
    age: 27, 
    first_name:"Freddie", 
    last_name: "Mercury", 
    search : '27 Freddie Mercury' 
} 
+0

Правда, что объединение полей вряд ли, однако, будучи в состоянии искать «Freddie Mercury» (сочетающие поля), но не в состоянии для целочисленных полей кажется неинтуитивным к клиенту. Включение поля поиска вручную будет работать, но сложно поддерживать его во время обновлений. Пример: что, если пара kay/val удаляется, если индекс 'search' терпит неудачу? Я генерирую новую строку индекса каждый раз, когда обновляется даже одно поле? Это всего лишь пара проблем, которые mongo уже решила по большей части (текстовые индексы по умолчанию являются разреженными). – KFunk

Смежные вопросы