# Search index in Atlas MongoDB Cloud
### Create index
###### Для создания поискового индекса требуется в консоли Atlas MongoDB выбрать требуемую коллекцию, выбрать вкладку __Search__, и нажать кнопку __CreateSearchIndex__

###### Далее требуется заполнить структуру и описание индекса в данном окне:

###### Для примера можно использовать следующий пример:
```xml
{
"mappings": {
"dynamic": false,
"fields": {
"comment_text": {
"analyzer": "lucene.standard",
"multi": {
"english": {
"analyzer": "lucene.english",
"type": "string"
},
"russian": {
"analyzer": "lucene.russian",
"type": "string"
}
},
"type": "string"
}
}
}
}
```
### Index fields description
##### __dynamic__ - если true, то все поля автоматически попадают под индекс, если false то ожидаем настроек для требуемых полей
##### __fields__ - список полей которые должны быть подвергнуты индексированию
##### __analyzer__ - используемый по умолчанию индекс, если не указан дополнительный
##### __multi__ - список подиндексов которые будут созданы (используется для поддержки различных языков), в текущем примере на поле comment_text создается два индекса на английском и русском языке
### Дополнительно
###### Различные языки используются для корректного формирования индекса, в разных языках различные нюансы написания текстов, а также различные __stop_words__ в понимании NLP (Natural Language Processing), например при индексации текста - "Привет, как у тебя дела?", русский индекс сформирует массив ["Привет", "тебя", "дела"], а в английском ["Привет", "как", "у", "тебя", "дела"], и поиск по второму массиву будет "загрязнен" стоп словами.
###### Время первичного формирования индекса зависит от колличества узлов кластера, а также от количества уже существующих в нем документов, обновление индекса возможно на "горячую", что не приведет к остановке возможности поиска по данному индексу.
### Make search with __pyMongo__
```python
from pymongo import MongoClient
mongo_conn = MongoClient("localhost", 27017)
mongo = mongo_conn.db_name
search_pipeline = [
{"$search":
{"text": {
"query": ["Княжна", "Ростова"],
"path": {"value": "comment_text", "multi": "russian"}
}
}
},
{
"$project": {
"comment_text": 1,
"_id": 1
}
}
]
res = mongo.collection_name.aggregate(search_pipeline)
```
### Make search with __mongoengine__
##### __res__ - тип __cursor__, результат поиска отсортированный по точности попадания, элементы курсора - __dict__
```python
import mongoengine
class Comment(mongoengine.Document):
comment_text = mongoengine.StringField(db_field="comment_text")
mongoengine.connect(db="db_name")
search_pipeline = [
{"$search":
{"text": {
"query": ["Княжна", "Ростова"],
"path": {"value": "comment_text", "multi": "russian"}
}
}
},
{
"$project": {
"comment_text": 1,
"_id": 1
}
}
]
res = Comment.objects().aggregate(search_pipeline)
```
##### __res__ - тип __cursor__, результат поиска отсортированный по точности попадания, элементы курсора - объекты типа __Comment__