本章內容:
- 概述
- 文本索引版本
- 創建文本索引
- 大小寫不敏感
- 變音符號不敏感
- 分詞與分隔符
- 索引條目
- 支持的語言和停用詞
- 稀疏性
- 限制條件
- 存儲要求和性能成本
- 支持文本搜索
MONGODB ATLAS搜索:
Atlas Search使在MongoDB數據之上輕鬆構建基於關聯的快速搜索功能成爲可能。立即在MongoDB Atlas(官方完全託管的數據庫服務)上試用。
一、概述
爲了支持對字符串內容的文本搜索查詢,MongoDB提供了文本索引。文本(text )索引可以包含任何值爲字符串或字符串元素數組的字段。
二、文本索引版本
文本索引版本 |
描述 |
---|---|
版本3 |
MongoDB引入了文本索引的版本3。版本3是在MongoDB 3.2及更高版本中創建的文本索引的默認版本。 |
版本2 |
MongoDB 2.6引入了文本索引的版本2。版本2是在MongoDB 2.6和3.0系列中創建的文本索引的默認版本。 |
版本1 |
MongoDB 2.4引入了文本索引的版本1。 MongoDB 2.4僅支持版本1。 |
要覆蓋默認版本並指定其他版本,請在創建索引時包含選項:
{ "textIndexVersion": <version> } 。
三、創建文本索引
重要:
一個集合最多有一個文本索引。
要創建文本索引,請使用db.collection.createIndex()方法。
要爲包含字符串或字符串元素數組的字段建立索引,請包括該索引字段並指定字符串符號“text”,如以下示例所示:
db.reviews.createIndex( { comments: "text" } )
您可以爲多個字段建立文本索引。以下示例在subject 和 comments字段上創建文本索引:
db.reviews.createIndex(
{
subject: "text",
comments: "text"
}
)
複合索引可以包括文本索引鍵以及升/降索引鍵。有關更多信息,請參見複合索引。
爲了刪除文本索引,請使用索引名稱。有關更多信息,請參見使用索引名稱刪除文本索引。
1.指定權重
對於文本索引,索引字段的權重表示就文本搜索分數而言,該字段相對於其他索引字段的重要性。
對於文檔中的每個索引字段,MongoDB將匹配數乘以權重並求和。然後,使用此總和,MongoDB計算文檔的分數。有關按文本分數返回和排序的詳細信息,請參見$ meta運算符。
索引字段的默認權重爲1。要調整索引字段的權重,請在 db.collection.createIndex()方法中包括weights選項。
有關使用權重控制文本搜索結果的更多信息,請參見使用權重控制搜索結果。
2.通配符(Wildcard)文本索引
注意
儘管通配符文本索引和通配符索引共享通配符$**字段模式,但它們是不同的索引類型。僅通配符文本索引支持$ text運算符。
在多個字段上創建文本索引時,可以使用通配符說明符($ **)。使用通配符文本索引,MongoDB會爲集合中的所有文檔的每一個包含字符串數據的字段建立索引。下面的示例使用通配符創建文本索引:
db.collection.createIndex( { "$**": "text" } )
該索引允許在具有字符串內容的所有字段上進行文本搜索。如果不清楚哪些字段要創建文本索引或用於實時查詢(Ad-Hoc Query),則此類索引對於高度非結構化的數據很有用。
通配符文本索引是多個字段上的文本索引。這樣,可以在創建索引期間將權重分配給特定字段,以控制結果的排名。有關使用權重控制文本搜索結果的更多信息,請參見使用權重控制搜索結果。
與所有文本索引一樣,通配符文本索引可以是複合索引的一部分。例如,以下代碼在字段a和通配符說明符上創建一個複合索引:
db.collection.createIndex( { a: 1, "$**": "text" } )
與所有複合文本索引一樣,由於a在文本索引鍵之前,因此要使用該索引執行$ text搜索,查詢謂詞必須包含等式匹配條件a。有關複合文本索引的信息,請參見複合文本索引。
四、大小寫不敏感
在版本3.2中更改。
文本索引的版本3,支持通用的C,簡單的S,以及對於土耳其語中T的大寫轉換(case foldings),均支持Unicode 8.0字符數據庫大寫轉換。
大小寫轉換(case foldings)擴展了文本索引的大小寫不敏感,包括帶有變音符的字符(例如é和É)以及非拉丁字母的字符,例如西裏爾字母的“И”和“и”。
關於大小寫轉換(case foldings),請參考如下鏈接:
文本索引的版本3支持變音符不敏感。因此,索引對é,É,e和E無法分辨。
之前版本的文本索引僅對[A-z]的大小寫不敏感;即僅對非變音符號的拉丁字符不區分大小寫。對於所有其他字符,早期版本的文本索引將它們視爲不同的字符。
五、變音符不敏感
在版本3.2中更改。
在版本3中,文本索引對變音符不敏感。也就是說,索引不會區分包含變音符的字符和不包含變音符字符,例如é,ê和e。更具體地說,文本索引會刪除Unicode 8.0字符數據庫屬性列表中歸爲變音符的字符。
文本索引的版本3對帶有變音符的字符也是大小寫不敏感。因此,索引也無法區分é,É,e和E。
早期版本的文本索引將帶有變音符號的字符視爲不同的字符。
六、分詞與分隔符
在版本3.2中更改。
對於分詞(tokenization),版本3文本索引使用分隔符(delimiters),這些分隔符在
Unicode 8.0字符數據庫屬性列表中分類爲Dash,Hyphen,Pattern_Syntax,Quotation_Mark,
Terminal_Punctuation和White_Space。
例如,對於字符串"Il a dit qu'il «était le meilleur joueur du monde»",則文本索引會將«,»和空格作爲分隔符。
索引的先前版本將«視爲術語”«était”的一部分,並將»視爲術語”monde»”的一部分。
註釋
tokenization (分詞):就是把一篇文章拆分成一個個的單詞(The process of breaking text apart is called tokenization )。
Delimiters (分隔符):要把一個句子 分割成一個個的單詞,就需要分隔符,常用的分隔符有:空格、tab鍵(\t);還有 逗號、句號……這個要視具體的處理任務而定(The elements of the text that determine where elements should be split are called Delimiters)。
七、索引條目
文本索引標記並阻止索引條目的索引字段中的術語。文本索引爲集合中每個文檔的每個索引字段中的每個唯一詞幹項存儲一個索引條目。該索引使用特定於語言的簡單後綴詞幹。
八、支持的語言和停用詞
MongoDB支持多種語言的文本搜索。文本索引會丟棄特定於語言的停用詞(例如英語中,the,an,a,and等),並使用簡單的特定於語言的後綴詞幹。有關支持的語言的列表,請參見文本搜索語言。
如果您將語言(language)值設置爲"none",則文本索引將使用簡單的標記,沒有停用詞列表且沒有詞幹。
要爲文本索引指定語言,請參閱爲文本索引指定語言。
九、稀疏性
文本索引始終是稀疏的,並且忽略稀疏選項。如果文檔缺少文本索引字段(或者該字段爲null或空數組),則MongoDB不會將文檔條目添加到文本索引中。對於插入,MongoDB插入文檔,但不添加到文本索引。
對於包含文本索引鍵以及其他類型的鍵的複合索引,只有文本索引字段才能確定索引是否引用文檔。其他鍵不能確定索引是否引用文檔。
十、限制條件
- 每個集合一個文本索引
一個集合最多可以有一個文本索引。
- 文本搜索和hint()
如果查詢包含$ text查詢表達式,則不能使用hint()。
- 文本索引和排序
排序操作無法從文本索引(甚至是複合文本索引)獲得排序順序;即排序操作不能使用文本索引中的順序。
- 複合索引
複合索引可以包含文本索引鍵和升/降索引鍵。但是,這些複合索引具有以下限制:
- 複合文本索引不能包含任何其他特殊索引類型,例如多鍵或地理空間索引字段。
- 如果複合文本索引在文本索引鍵之前包含鍵(文本索引鍵不是複合索引的第一個鍵),則要執行$ text搜索,查詢謂詞必須在前面的鍵上包含相等匹配條件(equality match conditions)。
- 創建複合文本索引時,所有文本索引鍵必須在索引規範文檔中依次列出。
要了解其他更多限制,請參閱文本索引和排序。
有關複合文本索引的示例,請參見限制掃描的條目數。
- 刪除文本索引
要刪除文本索引,需要把索引名稱傳遞給db.collection.dropIndex()方法。
獲取索引的名稱,請使用db.collection.getIndexes()方法。
有關文本索引的默認命名方案以及覆蓋默認名稱的信息,請參見爲文本索引指定名稱。
- 比對選項(Collation)
文本索引僅支持簡單的二進制比較,不支持比對規則。
註釋
collation即比對方法:用於指定數據集如何排序,以及字符串的比對規則。
要在具有非簡單歸類的集合上創建文本索引,必須在創建索引時顯式指定{collation: {locale: "simple"} }。
十一、存儲要求和性能成本
文本索引具有以下存儲要求和性能成本:
- 文本索引可能很大。對於每個插入的文檔,每個索引字段中的每個唯一詞幹都包含一個索引條目。
- 構建文本索引與構建大型多鍵索引非常相似,並且比在相同數據上構建簡單的有序(標量)索引要花更長的時間。
- 在現有集合上構建較大的文本索引時,請確保對打開的文件描述符有足夠高的限制。請參閱推薦設置。
- 文本索引將影響插入吞吐量,因爲MongoDB必須在每個新源文檔的每個索引字段中爲每個唯一詞幹添加一個索引條目。
- 此外,文本索引不存儲短語或有關文檔中單詞接近程度的信息。結果,當整個集合放入RAM中時,短語查詢將更有效地運行。
十二、支持文本搜索
文本索引支持$ text查詢操作。有關文本搜索的示例,請查閱$ text參考。有關聚合管道中$ text操作的示例,請參閱聚合管道中的文本搜索。
上一篇:多鍵索引的邊界處理(一)和 多鍵索引的邊界處理(二)
參考原文:https://docs.mongodb.com/manual/core/index-text/#create-text-index