# Search index in Atlas MongoDB Cloud ### Create index ###### Для создания поискового индекса требуется в консоли Atlas MongoDB выбрать требуемую коллекцию, выбрать вкладку __Search__, и нажать кнопку __CreateSearchIndex__ ![](https://i.imgur.com/H7f7efK.png) ###### Далее требуется заполнить структуру и описание индекса в данном окне: ![](https://i.imgur.com/uyUD5l6.png) ###### Для примера можно использовать следующий пример: ```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__