创建 Atlas Search 索引
Atlas Search 索引是一种数据结构,它会以易于搜索的格式对数据进行分类。它是术语与包含这些术语的文档之间的映射。Atlas Search 索引可以使用某些标识符更快地检索文档。您必须配置 Atlas Search 索引才能使用 Atlas Search 查询 Atlas 集群中的数据。
您可在单个字段或多个字段上创建 Atlas Search 索引。我们建议您对经常用于排序或筛选数据的字段建立索引,以便在查询时快速检索包含相关数据的文档。
您可以通过 Atlas UI、API、Atlas CLI 和 Terraform 为 Atlas 集群上除 时间序列集合之外的所有集合创建 Atlas Search 索引。
先决条件
要创建 Atlas Search 索引,您必须拥有符合以下条件的 Atlas 集群:
任何集群层上的 MongoDB 版本
4.2
或更高版本。要为其创建 Atlas Search 索引的集合。
必需的访问权限
下表列出了每个角色支持的访问模式。
角色 | 操作 | Atlas UI | Atlas API | Atlas Search API | Atlas CLI |
---|---|---|---|---|---|
| 用于查看 Atlas Search 分析器和索引。 | ✓ | ✓ | ||
| 创建和管理 Atlas Search 分析器和索引,并为您的 API 密钥分配角色。 | ✓ | ✓ | ✓ | ✓ |
✓ | ✓ | ||||
为 API 密钥创建访问列表条目,并从显示在 API 密钥访问列表中的客户端发送请求。 | ✓ | ✓ | |||
使用 Atlas 用户界面或 API 创建、查看、编辑和删除 Atlas Search 索引。 | ✓ | ✓ | ✓ |
您必须至少拥有要创建索引的数据库的 readWriteAnyDatabase
角色或 readWrite
访问权限。如需了解更多信息,请参阅内置角色或特定权限。
索引限制
您创建的内容不能超过:
在
M0
集群上具有 3 个索引。M2
集群上有 5 个索引。M5
集群上有 10 个索引。
我们建议您在单个
M10+
集群上创建不超过 2 个、500 个搜索索引。要从Compass创建Atlas
M10+
Search索引,您必须有一个运行MongoDB7.0 或更高版本的 Atlas 集群。
估算您的索引大小
您可以通过在集合的子集上创建索引来估计索引的大小:
从数据中抽取样本,用样本数据创建新的数据集。
在包含示例数据的集合上创建搜索索引。
注意
示例数据的索引定义必须与要在完整集合中创建的索引定义相同。
根据数据的总大小来扩展示例数据索引的大小。
estimated-index-size = ( subset-data-index-size / subset-data-size ) x total-collection-data-size
例子
此示例使用 sample_mflix.movies
命名空间。我们首先运行 $sample
,从 movies
集合中随机抽取 10 个文档,然后创建一个名为 sample_data
的新集合,其中包含 $sample
个输出文档:
db.movies.aggregate([ { $sample: { size: 10 } }, { $out: "sample_data" } ])
[ { _id: ObjectId('573a13bbf29313caabd53f9c'), plot: "Three years ago, in real-life, Hama Ali, a charismatic actor from Iraq famous locally for his performance as Iraq's version of Superman, met Ayca on a film-set. He and Ayca, a fiery actress...", genres: [ 'Drama', 'Romance', 'War' ], runtime: 93, cast: [ 'Ayèa Damgaci', 'Hama Ali Kahn', 'Cengiz Bozkurt', 'Nesrin Cavadzade' ], num_mflix_comments: 1, poster: 'https://m.media-amazon.com/images/M/MV5BMjA1OTI1MjI4OV5BMl5BanBnXkFtZTgwODk1MTA2MDE@._V1_SY1000_SX677_AL_.jpg', title: 'Gitmek: My Marlon and Brando', fullplot: "Three years ago, in real-life, Hama Ali, a charismatic actor from Iraq famous locally for his performance as Iraq's version of Superman, met Ayca on a film-set. He and Ayca, a fiery actress from Turkey, had a passionate love affair before returning to their respective homes. From his Kurdish village, Hama Ali sends Ayca video love letters which he has filmed on his handycam. She watches them from her sofa in Istanbul, with her cat for company. The video love letters capture the hellish violence engulfing Iraq, the goats and uncles populating his rural area, and also his tender affection towards her. Feeling suffocated by her own city and angered by the indifference towards the war that surrounds her, Ayca decides to make the journey eastwards to Iraq to be reunited with her lover. GITMEK, a dramatic feature film, is based on the true story of Ayca's departure from Istanbul and her extraordinary journey to the Iraqi border. At a time when many people were fleeing from East to West in search of safety, Ayca makes the opposite journey, in search of love. She is helped by immigrant artists who live in the slums of Istanbul and the mothers of long distance truck drivers who she meets at various border towns. The journey takes her through breathtaking landscapes, strange encounters and terrifying times.", languages: [ 'English', 'Kurdish', 'Turkish' ], released: ISODate('2008-11-14T00:00:00.000Z'), directors: [ 'Huseyin Karabey' ], writers: [ 'Ayèa Damgaci', 'Huseyin Karabey' ], awards: { wins: 12, nominations: 4, text: '12 wins & 4 nominations.' }, lastupdated: '2015-07-04 00:20:59.083000000', year: 2008, imdb: { rating: 6.6, votes: 628, id: 920460 }, countries: [ 'Turkey' ], type: 'movie', tomatoes: { viewer: { rating: 3.7, numReviews: 181, meter: 79 }, lastUpdated: ISODate('2015-07-16T18:10:38.000Z') } }, { _id: ObjectId('573a139af29313caabcefb6a'), plot: '48 hours of intersecting lives and crimes in Los Angeles.', genres: [ 'Comedy', 'Crime', 'Drama' ], runtime: 104, rated: 'R', cast: [ 'Danny Aiello', 'Greg Cruttwell', 'Jeff Daniels', 'Teri Hatcher' ], num_mflix_comments: 1, poster: 'https://m.media-amazon.com/images/M/MV5BZDI0ZmFmYTgtMTQ5OS00MTVmLTgwNWYtNzIyY2Y5NjYxNzgyXkEyXkFqcGdeQXVyNzc5MjA3OA@@._V1_SY1000_SX677_AL_.jpg', title: '2 Days in the Valley', fullplot: 'John Herzfeld deftly welds together a multitude of subplots-- a loser hitman and a cool assassin involved in an insurance scam; a washed-up director, turned suicidal, if only he had someone to care for his beloved dog; a snooty art dealer, wracked by kidney stones, cared for by his devoted assistant; a grungy deranged vice cop, now partnered with a fresh-faced rookie; and two beautiful and jealous women entangled in their deadly scheme--into a spoof of the crime thriller genre.', languages: [ 'English', 'Vietnamese' ], released: ISODate('1996-09-27T00:00:00.000Z'), directors: [ 'John Herzfeld' ], writers: [ 'John Herzfeld' ], awards: { wins: 0, nominations: 1, text: '1 nomination.' }, lastupdated: '2015-09-11 00:42:22.520000000', year: 1996, imdb: { rating: 6.5, votes: 15019, id: 115438 }, countries: [ 'USA' ], type: 'movie', tomatoes: { viewer: { rating: 3, numReviews: 14630, meter: 55 }, dvd: ISODate('2001-08-07T00:00:00.000Z'), critic: { rating: 6, numReviews: 53, meter: 60 }, lastUpdated: ISODate('2015-08-19T18:25:36.000Z'), consensus: 'A labyrinthine thriller with a host of memorable characters, 2 Days in the Valley is an uneven but intriguing thriller/black comedy.', rotten: 21, production: 'HBO Video', fresh: 32 } }, { _id: ObjectId('573a13bdf29313caabd5943e'), fullplot: "When Emily Parris exposes a secret society of teenage girls who have slipped out of the world of social media and into another world they've discovered in the woods at night. When she accuses the girls of committing sexually deviant activities, Emily sends the small American town into a atmosphere of hysteria and the national media spotlight. The mystery deepens when each of the accused girls upholds a vow of silence.", imdb: { rating: 6.2, votes: 861, id: 1015471 }, year: 2014, plot: "When a teenage girl says she's the victim of a secret network called The Sisterhood of Night, a quiet suburban town becomes the backdrop for a modern-day Salem witch trial.", genres: [ 'Drama', 'Mystery', 'Thriller' ], rated: 'PG-13', metacritic: 60, title: 'The Sisterhood of Night', lastupdated: '2015-09-10 17:22:16.113000000', languages: [ 'English' ], writers: [ 'Marilyn Fu (screenplay)', 'Steven Millhauser (short story)' ], type: 'movie', tomatoes: { website: 'http://www.thesisterhoodofnight-movie.com/', viewer: { rating: 3.6, numReviews: 382, meter: 65 }, dvd: ISODate('2015-06-09T00:00:00.000Z'), critic: { rating: 6.6, numReviews: 19, meter: 79 }, boxOffice: '$5.3k', rotten: 4, production: 'Cine Mosaic', lastUpdated: ISODate('2015-09-13T17:24:37.000Z'), fresh: 15 }, poster: 'https://m.media-amazon.com/images/M/MV5BODg3MjE0MDM4N15BMl5BanBnXkFtZTgwOTY0MjE5NDE@._V1_SY1000_SX677_AL_.jpg', num_mflix_comments: 1, released: ISODate('2014-10-18T00:00:00.000Z'), awards: { wins: 2, nominations: 3, text: '2 wins & 3 nominations.' }, countries: [ 'USA' ], cast: [ 'Georgie Henley', 'Kara Hayward', 'Willa Cuthrell', 'Olivia DeJonge' ], directors: [ 'Caryn Waechter' ], runtime: 104 }, { _id: ObjectId('573a13c4f29313caabd6d7bf'), plot: 'A film producer struggles with suicidal despair.', genres: [ 'Drama' ], runtime: 110, metacritic: 76, cast: [ 'Louis-Do de Lencquesaing', 'Chiara Caselli', 'Alice de Lencquesaing', 'Alice Gautier' ], num_mflix_comments: 0, poster: 'https://m.media-amazon.com/images/M/MV5BMTUxODczODA2NV5BMl5BanBnXkFtZTcwNzExMjQ1Mw@@._V1_SY1000_SX677_AL_.jpg', title: 'Father of My Children', fullplot: "In the first half, Gregoire, a movie producer of great charm, owner of Moon Films, plays with his younger daughters, talks with his wife and his eldest daughter, and keeps his studio going while one project hemorrhages money and creditors circle. In the second half, Sylvia, his Italian wife, tries to hold the family together as she looks fully into Moon Films' troubles. She meets with a banker, a temperamental Swede, Russian TV magnates, a film lab exec, and Moon's lawyer. Clèmence, the oldest daughter, goes on her own search. Debt can crush; how does a family pick up the pieces?", languages: [ 'French' ], released: ISODate('2009-12-16T00:00:00.000Z'), directors: [ 'Mia Hansen-Lève' ], writers: [ 'Mia Hansen-Lève (screenplay)' ], awards: { wins: 2, nominations: 3, text: '2 wins & 3 nominations.' }, lastupdated: '2015-09-02 00:01:22.897000000', year: 2009, imdb: { rating: 6.7, votes: 1820, id: 1356928 }, countries: [ 'France', 'Germany', 'Belgium' ], type: 'movie', tomatoes: { website: 'http://www.filmsdulosange.fr/fr/fr_peredemesenfants.html', viewer: { rating: 3.3, numReviews: 1232, meter: 60 }, dvd: ISODate('2010-06-21T00:00:00.000Z'), critic: { rating: 7.4, numReviews: 55, meter: 91 }, lastUpdated: ISODate('2015-09-11T18:38:12.000Z'), consensus: 'A tragedy gracefully lifted by tender empathy and moments of joy, Father of My Children is a quiet triumph for writer-director Mia Hansen-Love.', rotten: 5, production: 'IFC Films', fresh: 50 } }, { _id: ObjectId('573a13a5f29313caabd15cc1'), plot: 'After a 13-year imprisonment in Hong Kong, a kickboxer challenges the current champion in order to restore his honor.', genres: [ 'Drama', 'Romance', 'Sport' ], runtime: 105, cast: [ 'Andy Lau', 'Takako Tokiwa', 'Inthira Charoenpura', 'Apichaya Thanatthanapong' ], title: 'Ah Fu', lastupdated: '2015-09-14 12:56:13.823000000', languages: [ 'Cantonese' ], released: ISODate('2000-11-21T00:00:00.000Z'), directors: [ 'Daniel Lee' ], writers: [ 'Chi-Sing Cheung', 'Daniel Lee' ], awards: { wins: 1, nominations: 3, text: '1 win & 3 nominations.' }, year: 2000, imdb: { rating: 6.6, votes: 350, id: 277558 }, countries: [ 'Hong Kong' ], type: 'movie', tomatoes: { viewer: { rating: 3.3, numReviews: 644, meter: 57 }, lastUpdated: ISODate('2015-04-25T18:41:33.000Z') }, num_mflix_comments: 0 }, { _id: ObjectId('573a13bef29313caabd5ce2b'), plot: 'Johann Sebastian Bach llega con su familia a Leipzig para ocupar el puesto de cantor en la Escuela de Santo Tomès...', genres: [ 'Musical' ], runtime: 102, metacritic: 70, cast: [ 'Christian Atanasiu', 'Fèodor Atkine', 'George-Christoph Biller', 'Christian Brembeck' ], title: 'The Silence Before Bach', lastupdated: '2015-05-25 00:50:52.210000000', languages: [ 'Spanish', 'German', 'Catalan' ], released: ISODate('2007-12-21T00:00:00.000Z'), directors: [ 'Pere Portabella' ], writers: [ 'Xavier Albertè', 'Pere Portabella', 'Carles Santos' ], awards: { wins: 3, nominations: 3, text: '3 wins & 3 nominations.' }, year: 2007, imdb: { rating: 6.8, votes: 329, id: 1079450 }, countries: [ 'Spain' ], type: 'movie', tomatoes: { website: 'http://www.pereportabella.com/eng/fla/die/home_eng.html', viewer: { rating: 3.5, numReviews: 391, meter: 64 }, critic: { rating: 6.6, numReviews: 16, meter: 81 }, lastUpdated: ISODate('2015-08-11T19:15:49.000Z'), rotten: 3, production: 'Film Forum', fresh: 13 }, num_mflix_comments: 0 }, { _id: ObjectId('573a13ccf29313caabd83260'), plot: 'A woman subject to mental, physical, and sexual abuse on a remote island seeks a way out.', genres: [ 'Crime', 'Drama', 'Horror' ], runtime: 115, cast: [ 'Yeong-hie Seo', 'Seong-won Ji', 'Min-ho Hwang', 'Min Je' ], num_mflix_comments: 0, poster: 'https://m.media-amazon.com/images/M/MV5BMjAyNDEwMDgzMl5BMl5BanBnXkFtZTcwNzMyMTYwNQ@@._V1_SY1000_SX677_AL_.jpg', title: 'Bedevilled', fullplot: "Hae-won is a beautiful single woman in her thirties who works at a bank in the Seoul city. She leads a busy life until she becomes a witness to an attempted murder case, and at the same time, things get complicated at work. When things get out of hand she is forced to take a vacation so she heads for 'Moodo', a small undeveloped island, where she had once visited to see her grandparents. And where she had befriended a girl named Bok-nam who stills writes to Hae-won asking her to visit despite the fact that Hae-won never bothered to reply. Upon arriving at the island, Hae-won is shocked to see everyone treating Bok-nam like a slave. As practically the only young woman on the island, she is a plaything for all the men and a free laborer for the women. Sick of all the inhumane treatment, Bok-nam had tried to escape the island several times in the past but had failed each time. She begs Hae-won to help her escape the place, but Hae-won remains indifferent not wanting to be involved in complicated situations. When Bok-nam realizes that her own daughter will follow her footsteps, she tries to escape the island with her daughter.", languages: [ 'Korean' ], released: ISODate('2010-09-02T00:00:00.000Z'), directors: [ 'Cheol-soo Jang' ], writers: [ 'Kwang-young Choi' ], awards: { wins: 10, nominations: 5, text: '10 wins & 5 nominations.' }, lastupdated: '2015-09-01 01:18:02.960000000', year: 2010, imdb: { rating: 7.3, votes: 7983, id: 1646959 }, countries: [ 'South Korea' ], type: 'movie' }, { _id: ObjectId('573a13c7f29313caabd746fe'), plot: 'A Californian family inherits a castle in Romania. This is especially exciting to the son, who is obsessed with monsters. And he is not disappointed.', genres: [ 'Comedy', 'Family' ], runtime: 83, rated: 'TV-G', cast: [ 'Victoria Justice', 'Chase Ellison', 'Anna Galvin', 'Matt Winston' ], num_mflix_comments: 0, poster: 'https://m.media-amazon.com/images/M/MV5BMjU1MmJlMTctY2FiMC00MmU1LWI5NmYtMDc5OWM0NjEzMmI2XkEyXkFqcGdeQXVyNDgyODgxNjE@._V1_SY1000_SX677_AL_.jpg', title: 'The Boy Who Cried Werewolf', fullplot: 'A Californian family inherits a castle in Romania. This is especially exciting to the son, who is obsessed with monsters. And he is not disappointed.', languages: [ 'English' ], released: ISODate('2010-10-22T00:00:00.000Z'), directors: [ 'Eric Bross' ], writers: [ 'Art Edler Brown', 'Douglas Sloan' ], awards: { wins: 1, nominations: 2, text: '1 win & 2 nominations.' }, lastupdated: '2015-08-20 00:01:59.673000000', year: 2010, imdb: { rating: 6.3, votes: 1582, id: 1451423 }, countries: [ 'USA', 'Canada' ], type: 'movie', tomatoes: { viewer: { rating: 3.7, numReviews: 762, meter: 66 }, lastUpdated: ISODate('2015-09-12T17:30:20.000Z') } }, { _id: ObjectId('573a13b4f29313caabd3f473'), genres: [ 'Documentary' ], runtime: 85, title: 'Zero Degrees of Separation', countries: [ 'Canada' ], lastupdated: '2015-08-09 00:30:38.977000000', languages: [ 'Arabic', 'English', 'Hebrew' ], released: ISODate('2005-06-22T00:00:00.000Z'), directors: [ 'Elle Flanders' ], writers: [ 'Elle Flanders' ], awards: { wins: 1, nominations: 0, text: '1 win.' }, year: 2005, imdb: { rating: 6.6, votes: 90, id: 454990 }, type: 'movie', tomatoes: { viewer: { rating: 3.5, numReviews: 5, meter: 100 }, fresh: 1, critic: { numReviews: 2 }, rotten: 1, lastUpdated: ISODate('2015-01-04T23:25:58.000Z') }, num_mflix_comments: 0 }, { _id: ObjectId('573a13bff29313caabd5f070'), plot: 'This hilarious genre-bending comedy follows Gary Brewer, along with girlfriend Holly Brewer (no relation), and best friend Trevor Morehouse as Gary quests to reign supreme at the 2006 Rock, Paper, Scissors World Championships.', genres: [ 'Comedy' ], runtime: 85, cast: [ 'Tim Doiron', 'April Mullen', 'Ryan Tilley', 'Peter Pasyk' ], num_mflix_comments: 0, poster: 'https://m.media-amazon.com/images/M/MV5BMTI5MzIwMjA2Ml5BMl5BanBnXkFtZTcwOTcyOTA4MQ@@._V1_SY1000_SX677_AL_.jpg', title: 'Rock, Paper, Scissors: The Way of the Tosser', fullplot: 'This hilarious genre-bending comedy follows Gary Brewer, along with girlfriend Holly Brewer (no relation), and best friend Trevor Morehouse as Gary quests to reign supreme at the 2006 Rock, Paper, Scissors World Championships.', languages: [ 'English' ], released: ISODate('2007-07-06T00:00:00.000Z'), directors: [ 'Tim Doiron', 'April Mullen' ], writers: [ 'Tim Doiron (creator)', 'April Mullen (creator)', 'Tim Doiron' ], awards: { wins: 2, nominations: 0, text: '2 wins.' }, lastupdated: '2015-08-12 00:01:33.813000000', year: 2007, imdb: { rating: 6.2, votes: 316, id: 1121964 }, countries: [ 'Canada' ], type: 'movie' } ]
接下来,对于使用 $out
添加到 sample_data
集合的 $sample
输出数据,我们仅在 title
字段上创建索引:
{ "mappings": { "dynamic": false, "fields": { "title": { "type": "string" } } } }
包含 10 个文档的 sample_data
集合中 title
字段的索引大小为 4.34 KB。sample_data
集合的大小为 14.19 KB。movies
集合的总大小为 32.54 MB,即 32540 KB。我们使用以下计算来估计整个 movies
集合的索引大小:
4.34 KB / 14.19 KB = 0.30584918957012 KB (per document) 0.30584918957012 KB x 32540 KB = 9952.3326286117048 KB 9265.466 KB x 0.001 MB = 9.952332628611705 MB
movies
集合中 title
字段的估计大小索引大小为 9.95 MB。但是, movies
集合的索引大小可能会根据其他非示例文档中标题的长度而变化。
创建 Atlas Search 索引
您可以使用 Atlas 用户界面、MongoDB Compass 来创建 Atlas Search 索引,也可以使用mongosh
、Atlas CLI、 API 或受支持的 MongoDB 驱动程序以您的首选语言以编程方式创建 Atlas Search 索引。
注意
Atlas Search 索引必须适用于完整集合,而不是仅适用于集合的一部分。
➤ 使用选择语言下拉菜单设置本节中示例的语言。
创建 Atlas Search 索引:
发送 POST
请求。
向 search/indexes
端点发送 POST
请求。
curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --include \ --request POST "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes" \ --data ' { "collectionName": "string", "database": "string", "name": "string", "type": "search", "definition": { "analyzer": "lucene.<analyzer>", "analyzers": [ { "charFilters": [ ... ], "name": "string", "tokenFilters": [ ... ], "tokenizer": { ... } } ], "mappings": { "dynamic": true | false, "fields": { "property1": {}, ... } }, "searchAnalyzer": "lucene.<analyzer>", "storedSource": { "include | exclude": [...] }, "synonyms": [ { "analyzer": "lucene.<analyzer>", "name": "string", "source": { "collection": "string" } } ] } }'
要了解有关此端点的语法和参数的更多信息,请参阅创建一个。
您还可以将 Atlas Search 与通过 Atlas CLI 创建的本地 Atlas 部署结合使用。要了解详情,请参阅创建本地 Atlas 部署。
为云部署创建 Atlas Search 索引
要使用 Atlas CLI 为集群创建搜索索引,请运行以下命令:
atlas clusters search indexes create [indexName] [options]
要了解有关命令语法和参数的更多信息,请参阅 Atlas CLI 文档中的 atlas clusters search indexes create 部分。
为本地部署创建 Atlas Search 索引
要使用 Atlas CLI 为指定部署创建搜索索引,请运行以下命令:
atlas deployments search indexes create [indexName] [options]
要了解有关命令语法和参数的更多信息,请参阅 Atlas CLI 文档的 atlas deployments search indexes create 部分。
例子
以下示例说明了如何使用 atlas clusters
或 atlas deployments
命令通过配置文件在非交互模式下创建 Atlas Search 索引。
对于 $search
查询,您创建默认 search
类型的索引。
步骤
要从 Atlas 用户界面创建 Atlas Search 索引,请执行以下操作:
AtlasGoClusters在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果尚未出现,请单击侧边栏中的 Clusters(集群)。
会显示集群页面。
转到集群的 Atlas Search 页面。
您可以从侧边栏、 Data Explorer 或集群详细信息页面转到 Atlas Search 页面。
在侧边栏中,单击 Services 标题下的 Atlas Search。
从 Select data source 下拉菜单中选择您的集群并单击 Go to Atlas Search。
将显示 Atlas Search 页面。
单击集群的对应 Browse Collections 按钮。
展开数据库并选择集合。
单击该集合的 Search Indexes 标签页。
将显示 Atlas Search 页面。
单击集群的名称。
单击 Atlas Search 标签页。
将显示 Atlas Search 页面。
输入 Index Name(索引名称),然后设置 Database and Collection(数据库和集合)。
在 Index Name 字段中,指定索引的名称。
索引名称在其命名空间中必须是唯一的。索引名称默认为 default。您可以接受默认名称或指定其他名称。
如果将索引命名为
default
,则在使用 $search 管道阶段时无需指定index
参数。如果您为索引指定了自定义名称,则必须在index
参数中指定此名称。在 Database and Collection 部分中,展开数据库,然后选择要创建索引的集合名称。
如果使用了 Visual Editor,则请单击 Next。
查看 Index Configurations(索引配置)部分中的默认 Atlas Search 索引配置设置。
您可以使用默认索引定义,也可以指定自定义索引定义:
字段名称 | 说明 | 必要性 |
---|---|---|
Index Analyzer | Optional | |
Query Analyzer | Optional | |
Dynamic Mapping | 指定字段的动态或静态映射。要禁用动态映射,请将 对应于 | 必需 |
字段名称 | 说明 | 必要性 |
---|---|---|
| Optional | |
| Optional | |
| 指定字段的动态或静态映射。要禁用动态映射,请将 | 必需 |
要详细了解这些索引定义设置,请参阅查看 Atlas Search 索引语法。
如果您对默认配置感到满意,请跳过。如果您希望完善您的 Atlas Search 索引,请继续执行下一步。
优化 Atlas Search 索引,配置其他设置。
如果您使用的是 Visual Editor:
单击 Refine Your Index 更改以下任何设置。
字段名称说明必要性Field Mappings
如果 Index Configurations 部分中的 Dynamic Mapping 处于禁用状态,则为必填项。
仅建议高级用户定义自己的字段映射。
指定要编制索引的字段。要添加字段,必须执行以下操作:
点击 Add Field 打开 Add Field Mapping 窗口。
指定关于字段的以下信息:
单击 Add 添加字段。
您可以选择单击 Actions 列中字段的省略号 (...) 图标来执行以下操作:
单击 Edit 修改字段的设置。
单击 Add Data Type 为该字段配置其他数据类型。
点击 Delete 将该字段从索引中删除。
您可以按任意顺序定义 Atlas Search 索引定义中的字段。
对应于
mappings.fields
JSON 设置。可选的
Stored Source Fields
指定要在 Atlas Search 上存储的字段。您可以选择以下选项之一:
None -(默认值)如果选择,Atlas Search 不会存储任何字段。
All - 如果选择,Atlas Search 会存储文档中的所有字段。
Specified - 如果选择,Atlas Search 会存储
_id
和您指定的字段。您可以通过执行以下操作来指定字段:从 Field Name 列的下拉列表中选择要存储在 Atlas Search 中的字段。
单击 Add 将字段添加到要存储的字段列表中。
单击 Add Field 并对要添加到列表中的每个字段重复步骤 a 和 b。
(可选)单击以下选项之一:
Edit 以选择其他字段。
Delete 从要存储的字段列表中删除字段。
All Except Specified - 如果选择此选项,Atlas Search 会从 Atlas Search 上的存储中排除特定字段。
从 Field Name 列的下拉列表中选择要排除的字段。
单击 Add 将字段添加到要排除的字段列表中。
单击 Add Field,然后对列表中要排除的每个字段重复步骤 a 和 b。
(可选)单击以下选项之一:
Edit 以选择其他字段。
Delete 从要排除的字段列表中删除该字段。
要了解有关存储字段的更多信息,请参阅在 Atlas Search 索引中定义存储的源字段。
对应于
storedSource
JSON 设置。Optional
Synonyms Mappings
指定要在索引中使用的同义词映射。要了解更多信息,请参阅在 Atlas Search 索引中定义同义词映射。
要添加同义词映射,您必须为每个同义词指定以下设置:
Synonym mapping name - 此标签用于标识查询时要引用的同义词映射。必须指定一个唯一值。不能指定空字符串值。
Synonym source collection - 用于标识与 Atlas Search 索引位于同一数据库中的 MongoDB 集合的标签。此集合中的文档使用同义词源集合文档中描述的格式。您还可以添加空集合或加载示例集合。
Analyzer - 用于标识与此同义词映射一起使用的分析器的标签。
您可以使用同义词映射仅查询使用同一分析器分析的字段。默认情况下,Atlas Search 使用标准分析器 (
"lucene.standard"
)。您可以指定任何 Atlas Search 分析器,但以下分析器除外:
lucene.kuromoji
lucene.cjk
daitchMokotoffSoundex 令牌筛选器
nGram 词元筛选器
edgeGram 词元筛选器
shingle 词元过滤器
对应于
synonyms
JSON 设置。可选。
Index Partitions
字段对象超过 2.1 十亿时要使用的分区数。
对应于
numPartitions
JSON 设置。重要
numPartitions
选项是作为“预览”功能的。可选。
单击 Save Changes(连接)。
如果您使用 Atlas Search JSON Editor ,请执行以下操作:
将以下任意设置添加到您的索引:
字段名称说明必要性mappings.fields
如果
mappings.dynamic
是false
,则为必填项。仅建议高级用户定义自己的字段映射。
指定要编制索引的字段。要了解更多信息,请参阅定义字段映射。
您可以按任意顺序定义 Atlas Search 索引定义中的字段。
可选的
storedSource
指定要在 Atlas Search 上存储的文档中的字段。值可以是以下值之一:
true
— 存储所有字段false
— 不存储任何字段指定在存储中包括 (
include
) 或排除 (exclude
) 的字段的对象
如果省略,则默认值为
false
。storedSource
仅适用于运行以下版本之一的 Atlas 集群:MongoDB 5.0.6 +
MongoDB 6.0+
MongoDB 7.0+
您可以在 Atlas Search 上存储所有受支持的数据类型的字段。要了解有关语法和字段的更多信息,请参阅 在 Atlas Search 索引中定义存储源字段。
Optional
synonyms
指定要在索引中使用的同义词映射。要了解更多信息,请参阅在 Atlas Search 索引中定义同义词映射。
您可以使用同义词映射仅查询使用同一分析器分析的字段。默认情况下,Atlas Search 使用标准分析器 (
"lucene.standard"
)。Optional
numPartitions
字段对象超过 2.1 十亿时要使用的分区数。 .. include:: /includes/fact-numpartitions-preview.rst
可选。
要详细了解这些索引定义设置,请参阅查看 Atlas Search 索引语法。
单击 Next(连接)。
可选。如果使用 Visual Editor(可视化编辑器),则可以保存或删除索引定义草稿。
单击 Cancel(连接)。
点击 Save Draft 或 Delete Draft。
重要
在有待处理的索引草稿时,您无法创建新索引。
要了解有关使用索引草稿创建索引的更多信息,请参阅恢复或删除 Atlas Search 索引草稿。
喜欢通过观看视频来学习?
本视频教程演示如何创建不同复杂程度的 Atlas Search 索引。
时长:15 分钟
要通过 mongosh
创建 Atlas Search 索引,请执行以下操作:
使用 mongosh
连接。
要了解更多信息,请参阅通过 mongosh
进行连接。
创建 Atlas Search 索引。
使用 db.collection.createSearchIndex()
方法。
命令具有以下语法。如果省略索引名称,Atlas Search 会将索引命名为 default
。要了解详情,请参阅查看 Atlas Search 索引语法。
db.<collection>.createSearchIndex( "<index-name>", { /* search index definition */ } )
例子
要创建名为 example-index
的索引来动态索引 movies
集合中的字段,请运行以下命令:
db.movies.createSearchIndex( "example-index", { mappings: { dynamic: true } } )
example-index
在 MongoDB Compass 中连接到您的 Atlas 集群。
打开 Compass 并连接到 Atlas 集群。有关连接的详细说明,请参阅通过 Compass 连接。
要使用 C 驱动程序创建 Atlas Search 索引,请在应用程序中定义搜索索引并调用 mongoc_collection_command_simple()
方法。
注意
Atlas Search 索引管理方法异步运行。驱动程序方法可以在确认成功运行前返回。要确定搜索索引的当前状态,请使用 $listSearchIndexes
管道阶段运行聚合操作。
将以下代码示例复制到该文件中。
以下示例应用程序指定 createSearchIndexes
命令来定义搜索索引,该索引对集合中的字段进行动态索引。然后,应用程序将命令和搜索索引信息转换为 BSON ,并将此信息传递给 mongoc_collection_command_simple()
方法来创建搜索索引。要了解更多信息,请参阅查看 Atlas Search 索引语法。
int main (void) { mongoc_client_t *client = NULL; mongoc_collection_t *collection = NULL; mongoc_database_t *database = NULL; bson_error_t error; bson_t cmd = BSON_INITIALIZER; bool ok = true; mongoc_init(); // Connect to your Atlas deployment client = mongoc_client_new("<connectionString>"); if (!client) { fprintf(stderr, "Failed to create a MongoDB client.\n"); ok = false; goto cleanup; } // Access your database and collection database = mongoc_client_get_database(client, "<databaseName>"); collection = mongoc_database_get_collection(database, "<collectionName>"); // Specify the command and the new index const char *cmd_str = BSON_STR({ "createSearchIndexes" : "<collectionName>", "indexes" : [ { "definition" : {"mappings" : {"dynamic" : true}}, "name" : "<indexName>" } ] }); // Convert your command to BSON if (!bson_init_from_json(&cmd, cmd_str, -1, &error)) { fprintf(stderr, "Failed to parse command: %s\n", error.message); ok = false; goto cleanup; } // Create the Atlas search index by running the command if (!mongoc_collection_command_simple (collection, &cmd, NULL, NULL, &error)) { fprintf(stderr, "Failed to run createSearchIndexes: %s\n", error.message); ok = false; goto cleanup; } printf ("Index created!\n"); cleanup: mongoc_collection_destroy (collection); mongoc_client_destroy (client); mongoc_database_destroy (database); bson_destroy (&cmd); mongoc_cleanup (); return ok ? EXIT_SUCCESS : EXIT_FAILURE; }
您还可以同时创建多个 Atlas Searchh 索引。在以下示例中,定义要在 indexes
数组中创建为文档的每个搜索索引。然后,将命令和搜索索引信息转换为 BSON 并调用 mongoc_collection_command_simple()
方法创建搜索索引:
int main (void) { mongoc_client_t *client = NULL; mongoc_collection_t *collection = NULL; mongoc_database_t *database = NULL; bson_error_t error; bson_t cmd = BSON_INITIALIZER; bool ok = true; mongoc_init(); // Connect to your Atlas deployment client = mongoc_client_new("<connectionString>"); if (!client) { fprintf(stderr, "Failed to create a MongoDB client.\n"); ok = false; goto cleanup; } // Access your database and collection database = mongoc_client_get_database(client, "<databaseName>"); collection = mongoc_database_get_collection(database, "<collectionName>"); // Specify the command and the new indexes const char *cmd_str = BSON_STR({ "createSearchIndexes" : "<collectionName>", "indexes" : [{ // Add your search index definition fields here "name" : "<firstIndexName>" }, { // Add your search index definition fields here "name" : "<secondIndexName>" }] }); // Convert your command to BSON if (!bson_init_from_json(&cmd, cmd_str, -1, &error)) { fprintf(stderr, "Failed to parse command: %s\n", error.message); ok = false; goto cleanup; } // Create the Atlas search indexes by running the command if (!mongoc_collection_command_simple (collection, &cmd, NULL, NULL, &error)) { fprintf(stderr, "Failed to run createSearchIndexes: %s\n", error.message); ok = false; goto cleanup; } printf ("Indexes created!\n"); cleanup: mongoc_collection_destroy (collection); mongoc_client_destroy (client); mongoc_database_destroy (database); bson_destroy (&cmd); mongoc_cleanup (); return ok ? EXIT_SUCCESS : EXIT_FAILURE; }
指定以下值并保存文件。
Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。
要创建索引的数据库和集合。
索引名称。如果省略索引名称,Atlas Search 会将索引命名为
default
。
搜索索引定义。要了解更多信息,请参阅查看 Atlas Search 索引语法。
要使用 C++ 驱动程序创建 Atlas Search 索引,请在应用程序中定义搜索索引并调用 create_one()
方法。
注意
Atlas Search 索引管理方法异步运行。驱动程序方法可以在确认成功运行前返回。要确定搜索索引的当前状态,请在搜索索引视图实例上调用 list()
方法。
将以下代码示例复制到该文件中。
以下示例应用程序将搜索索引名称和定义传递给 search_index_model()
方法,以动态索引集合中的字段。然后,应用程序将搜索索引规范传递给 create_one()
方法以创建搜索索引。要了解更多信息,请参阅查看 Atlas Search 索引语法。
using bsoncxx::builder::basic::kvp; using bsoncxx::builder::basic::make_document; using namespace mongocxx; int main() { try { // Connect to your Atlas deployment mongocxx::instance instance{}; mongocxx::uri uri("<connectionString>"); mongocxx::client client(uri); // Access your database and collection auto db = client["<databaseName>"]; auto collection = db["<collectionName>"]; // Create an index model with your index name and definition auto siv = collection.search_indexes(); auto name = "<indexName>"; auto definition = make_document(kvp("mappings", make_document(kvp("dynamic", true)))); auto model = search_index_model(name, definition.view()); // Create the search index siv.create_one(model); std::cout << "Index created!" << std::endl; } catch (const std::exception& e) { std::cout<< "Exception: " << e.what() << std::endl; } return 0; }
您还可以同时创建多个 Atlas Searchh 索引。对于要创建的每个搜索索引,将搜索索引规范传递给 search_index_model()
方法。然后,将每个搜索索引添加到一个向量中,并将该向量传递给 create_many()
方法以创建搜索索引:
using bsoncxx::builder::basic::kvp; using bsoncxx::builder::basic::make_document; using namespace mongocxx; int main() { try { // Connect to your Atlas deployment mongocxx::instance instance{}; mongocxx::uri uri("<connectionString>"); mongocxx::client client(uri); // Access your database and collection auto db = client["<databaseName>"]; auto collection = db["<collectionName>"]; // Create index models and add them to a vector auto siv = collection.search_indexes(); std::vector<search_index_model> models; auto name1 = "<firstIndexName>"; auto definition1 = make_document(/* Add search index definition fields here */); auto model1 = search_index_model(name1, definition1.view()); models.push_back(model1); auto name2 = "<secondIndexName>"; auto definition2 = make_document(/* Add search index definition fields here */); auto model2 = search_index_model(name2, definition2.view()); models.push_back(model2); // Create the search indexes siv.create_many(models); std::cout << "Indexes created!" << std::endl; } catch (const std::exception& e) { std::cout<< "Exception: " << e.what() << std::endl; } return 0; }
指定以下值并保存文件。
Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。
要创建索引的数据库和集合。
索引名称。如果省略索引名称,Atlas Search 会将索引命名为
default
。
搜索索引定义。要了解更多信息,请参阅查看 Atlas Search 索引语法。
创建一个索引
使用 .NET/C# 驱动程序创建 Atlas Search 索引:
构建一个定义索引的
BsonDocument
。将
BsonDocument
传递给CreateOne()
或CreateOneAsync()
方法。
以下示例应用程序定义了搜索索引,以对集合中的字段进行动态索引,然后运行 CreateOne()
方法来创建索引。要了解详情,请参阅查看 Atlas Search 索引语法。
将 Program.cs
文件的内容替换为定义索引的 BsonDocument
。
替换以下示例中的占位符值:
值 | 说明 |
---|---|
| Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。 |
| 要创建索引的数据库。 |
| 要为其创建索引的集合。 |
| 索引名称。如果省略索引名称,Atlas Search 会将索引命名为 |
using MongoDB.Bson; using MongoDB.Driver; // connect to your Atlas deployment var uri = "<connection-string>"; var client = new MongoClient(uri); var db = client.GetDatabase("<databaseName>"); var collection = db.GetCollection<BsonDocument>("<collectionName>"); // define your Atlas Search index var index = new BsonDocument { { "mappings", new BsonDocument { { "dynamic", true } } } }; var result = collection.SearchIndexes.CreateOne(index, "<indexName>"); Console.WriteLine(result);
创建多个索引
同时创建多个 Atlas Search 索引:
请构造一个包含搜索索引定义的
IEnumerable<CreateSearchIndexModel>
实例。将集合传递给
CreateMany()
或CreateManyAsync()
方法。
下面的示例展示了如何使用 CreateMany()
方法创建多个索引:
将 Program.cs
文件的内容替换为定义索引的 BsonDocument
。
替换以下示例中的占位符值:
值 | 说明 |
---|---|
| Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。 |
| 要创建索引的数据库。 |
| 要为其创建索引的集合。 |
| 第一个索引的名称。 |
| 最后一个索引的名称。 |
using MongoDB.Bson; using MongoDB.Driver; // connect to your Atlas deployment var uri = "<connection-string>"; var client = new MongoClient(uri); var db = client.GetDatabase("<databaseName>"); var collection = db.GetCollection<BsonDocument>("<collectionName>"); // define your Atlas Search indexes var indexes = new List<CreateSearchIndexModel> { new CreateSearchIndexModel( "<first-index-name>", new BsonDocument { // search index definition fields } ), ... new CreateSearchIndexModel( "<last-index-name>", new BsonDocument { // search index definition fields } ) }; var result = collection.SearchIndexes.CreateMany(indexes);
要使用Java 驱动程序创建 Atlas Search 索引,构建一个定义搜索索引的文档,然后将该文档传递给 createSearchIndex()
或 createSearchIndexes()
方法。要了解更多信息,请参阅驱动程序文档。
注意
Atlas Search 索引管理方法异步运行。驱动程序方法可以在确认成功运行前返回。要确定索引的当前状态,请调用 listSearchIndexes()
方法。
将以下代码示例复制到该文件中。
以下示例应用程序定义搜索索引,以对集合中的字段进行动态索引,然后运行 createSearchIndex()
方法来创建索引。要了解详情,请参阅查看 Atlas Search 索引语法。
import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; public class CreateIndex { public static void main(String[] args) { // connect to your Atlas cluster String uri = "<connection-string>"; try (MongoClient mongoClient = MongoClients.create(uri)) { // set namespace MongoDatabase database = mongoClient.getDatabase("<databaseName>"); MongoCollection<Document> collection = database.getCollection("<collectionName>"); Document index = new Document("mappings", new Document("dynamic", true)); collection.createSearchIndex("<index-name>", index); } } }
您可以使用以下示例应用程序一次创建多个 Atlas Search 索引。为此,请为要创建的每个搜索索引构造一个文档,然后将文档作为数组传递给 createSearchIndexes()
方法:
import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.SearchIndexModel; import org.bson.Document; import java.util.Arrays; public class CreateIndex { public static void main(String[] args) { // connect to your Atlas cluster String uri = "<connection-string>"; try (MongoClient mongoClient = MongoClients.create(uri)) { // set namespace MongoDatabase database = mongoClient.getDatabase("<databaseName>"); MongoCollection<Document> collection = database.getCollection("<collectionName>"); SearchIndexModel indexOne = new SearchIndexModel("<first-index-name>", new Document( // search index definition fields )); SearchIndexModel indexTwo = new SearchIndexModel("<second-index-name>", new Document( // search index definition fields )); collection.createSearchIndexes(Arrays.asList(indexOne, indexTwo)); } } }
指定以下值并保存文件。
Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。
要创建索引的数据库和集合。
您的索引的名称。如果省略索引的名称,Atlas Search 会将索引命名为
default
。
用于定义搜索索引的字段。要了解更多信息,请参阅查看 Atlas Search 索引语法。
创建一个索引
通过节点驱动程序创建 Atlas Search 索引:
从您的应用程序定义搜索索引。
运行
createSearchIndex
或createSearchIndexes
辅助方法。
以下名为 create-index.js
的样本应用程序定义搜索索引,以对集合中的字段进行动态索引,然后运行 createSearchIndex
命令来创建索引。要了解更多信息,请参阅查看 Atlas Search 索引语法。
定义搜索索引。
替换以下示例中的占位符值:
值 | 说明 |
---|---|
| Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。 |
| 要创建索引的数据库。 |
| 要为其创建索引的集合。 |
| 索引的名称。 如果省略索引名称,Atlas Search 会将索引命名为 |
import { MongoClient } from "mongodb"; // connect to your Atlas deployment const uri = "<connection-string>"; const client = new MongoClient(uri); async function run() { try { const database = client.db("<databaseName>"); const collection = database.collection("<collectionName>"); // define your Atlas Search index const index = { name: "<index-name>", definition: { /* search index definition fields */ "mappings": { "dynamic": true } } } // run the helper method const result = await collection.createSearchIndex(index); console.log(result); } finally { await client.close(); } } run().catch(console.dir);
创建多个索引
同时创建多个 Atlas Search 索引:
在您的应用程序中,定义搜索索引数组。
将数组传递给
createSearchIndexes
命令。
下面的示例展示了如何使用 createSearchIndexes
命令创建多个索引:
定义搜索索引。
替换以下示例中的占位符值:
值 | 说明 |
---|---|
| Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。 |
| 要创建索引的数据库。 |
| 要为其创建索引的集合。 |
| 第一个索引的名称。 |
| 最后一个索引的名称。 |
import { MongoClient } from "mongodb"; // connect to your Atlas deployment const uri = "<connection-string>"; const client = new MongoClient(uri); async function run() { try { const database = client.db("<databaseName>"); const collection = database.collection("<collectionName>"); // define an array of Atlas Search indexes const indexes = [ { name: "<first-index-name>", definition: { /* search index definition fields */ } }, ... { name: "<last-index-name>", definition: { /* search index definition fields */ } } ] // run the helper method const result = await collection.createSearchIndexes(indexes); console.log(result); } finally { await client.close(); } } run().catch(console.dir);
要使用 Python 驱动程序来创建 Atlas Search 索引,请在应用程序中定义搜索索引并调用 create_search_index()
方法。
注意
Atlas Search 索引管理方法异步运行。驱动程序方法可以在确认成功运行前返回。要确定搜索索引的当前状态,请对集合调用 list_search_indexes()
方法。
例子
将以下代码示例复制到该文件中。
以下示例应用程序定义了一个搜索索引,用于为集合中的字段动态编制索引。然后,应用程序在集合上调用 create_search_index()
方法来创建搜索索引。要了解更多信息,请参阅查看 Atlas Search 索引语法。
from pymongo.mongo_client import MongoClient from pymongo.operations import SearchIndexModel def create_index(): # Connect to your Atlas deployment uri = "<connectionString>" client = MongoClient(uri) # Access your database and collection database = client["<databaseName>"] collection = database["<collectionName>"] # Create your index model, then create the search index search_index_model = SearchIndexModel( definition={ "mappings": { "dynamic": True }, }, name="<indexName>", ) result = collection.create_search_index(model=search_index_model) print(result)
您还可以同时创建多个 Atlas Searchh 索引。在您的应用程序中,定义搜索索引数组。然后,将该数组作为参数传递给 create_search_indexes()
方法:
from pymongo.mongo_client import MongoClient from pymongo.operations import SearchIndexModel def create_indexes(): # Connect to your Atlas deployment uri = "<connectionString>" client = MongoClient(uri) # Access your database and collection database = client["<databaseName>"] collection = database["<collectionName>"] # Create your index models and add them to an array first_model = SearchIndexModel( definition={ # Add search index definition fields here }, name="<firstIndexName>", ) second_model = SearchIndexModel( definition={ # Add search index definition fields here }, name="<secondIndexName>", ) idx_models = [first_model, second_model] # Create the search indexes result = collection.create_search_indexes(models=idx_models) print(result)
指定以下值并保存文件。
Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。
要创建索引的数据库和集合。
索引名称。如果省略索引名称,Atlas Search 会将索引命名为
default
。
搜索索引定义。要了解更多信息,请参阅查看 Atlas Search 索引语法。
创建 Atlas Search 索引时, Atlas Search 页面会显示有关 Atlas Search 索引的信息。Status(状态)列显示集群主节点上索引的当前状态。要了解更多信息,请参阅查看索引状态。
警告
如果您对已具有 Atlas Search 索引的集合进行分片,当该集合开始出现在分片上时,您可能会遇到短暂的查询停机时间。此外,如果您为包含 Atlas Search 索引的已分片集合添加分片,针对该集合的搜索查询将失败,直到添加的分片完成初始同步过程为止。要了解更多信息,请参阅初始同步进程。