Khi bạn tạo một text
chỉ mục trong MongoDB, chỉ mục sử dụng ngôn ngữ mặc định là english
.
Ngôn ngữ mặc định xác định các quy tắc để phân tích cú pháp từ gốc (tức là từ gốc) và bỏ qua các từ dừng.
Tuy nhiên, bạn có thể thay đổi ngôn ngữ mặc định nếu cần.
Bạn cũng có thể chỉ định một ngôn ngữ ở cấp tài liệu và thậm chí ở cấp tài liệu nhỏ. Ngôn ngữ mặc định sẽ chỉ được sử dụng nếu ngôn ngữ chưa được chỉ định ở cấp tài liệu hoặc cấp dưới tài liệu.
Bài viết này trình bày các ví dụ về việc chỉ định ngôn ngữ cho text
chỉ mục.
Bộ sưu tập mẫu
Giả sử chúng ta có một bộ sưu tập có tên là sitcoms
với các tài liệu như thế này:
{ "_id" : 1, "original_name" : "Family Guy", "translations" : { "language" : "german", "sitcom_name" : "Familienmensch" } } { "_id" : 2, "original_name" : "Cuéntame como pasó", "language" : "spanish", "translations" : [ { "language" : "english", "sitcom_name" : "Tell me how it happened" }, { "language" : "french", "sitcom_name" : "Raconte-moi comment cela s'est passé" } ] }
Chúng ta có thể thấy rằng có hai tài liệu trong bộ sưu tập này. Mỗi tài liệu chứa tên của một bộ phim sitcom, cùng với các bản dịch của tên bộ phim đó bằng các ngôn ngữ khác nhau. Ngôn ngữ của mỗi bản dịch được chỉ định bằng ngôn ngữ language
trường của tiểu tài liệu tương ứng.
Tài liệu thứ hai trong bộ sưu tập này cũng bao gồm một language
ở cấp cao nhất của nó (trong trường hợp này là "language" : "spanish"
). Điều này có nghĩa là tên sitcom bằng tiếng Tây Ban Nha (hoặc ít nhất, tiếng Tây Ban Nha là ngôn ngữ chúng tôi muốn sử dụng khi tài liệu này được lập chỉ mục).
Tuy nhiên, tài liệu đầu tiên không chứa trường như vậy. Thực tế là tài liệu đầu tiên không chứa language
cấp cao nhất có nghĩa là chúng tôi muốn nó được lập chỉ mục bằng ngôn ngữ mặc định. Nếu không có ngôn ngữ mặc định nào được chỉ định trong quá trình lập chỉ mục, thì ngôn ngữ mặc định sẽ là tiếng Anh.
Nếu tài liệu được nhúng không chứa trường chỉ định ngôn ngữ thì tài liệu đó sẽ sử dụng trường ngôn ngữ của tài liệu kèm theo. Nếu tài liệu kèm theo không chứa trường ngôn ngữ thì tài liệu đó sẽ sử dụng ngôn ngữ mặc định.
Tạo chỉ mục văn bản cho nhiều ngôn ngữ
Hãy tiếp tục và tạo một text
chỉ mục cho bộ sưu tập trên.
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
}
)
Điều đó tạo ra một text
kết hợp lập chỉ mục trên original_name
và trường translations.sitcom_name
trường (tức là sitcom_name
trong tài liệu nhúng).
Bây giờ hãy sử dụng getIndexes()
để xem chỉ mục đó:
db.sitcoms.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "original_name_text_translations.sitcom_name_text", "weights" : { "original_name" : 1, "translations.sitcom_name" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Chúng ta có thể thấy rằng nó sử dụng ngôn ngữ mặc định là tiếng Anh. Điều này được chỉ định là "default_language" : "english"
.
Thay đổi ngôn ngữ mặc định
Chúng tôi có thể đặt một ngôn ngữ mặc định khác khi tạo chỉ mục nếu được yêu cầu.
Hãy bỏ chỉ mục và tạo lại nó bằng một ngôn ngữ mặc định khác:
db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish"
}
)
Hãy xem chỉ mục:
db.sitcoms.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "original_name_text_translations.sitcom_name_text", "default_language" : "danish", "weights" : { "original_name" : 1, "translations.sitcom_name" : 1 }, "language_override" : "language", "textIndexVersion" : 3 } ]
Chúng ta có thể thấy rằng ngôn ngữ mặc định bây giờ là danish
như đã chỉ định.
language_override
Tham số
Bạn có thể tự hỏi “làm thế nào mà MongoDB biết rằng language
của tài liệu trường là trường chỉ định ngôn ngữ? ”.
Và đó là một câu hỏi tuyệt vời. Rốt cuộc, điều gì sẽ xảy ra nếu chúng tôi đặt cho trường một tên khác - làm thế nào MongoDB biết rằng nó là trường để sử dụng cho ngôn ngữ?
Nếu bạn nhìn vào chỉ mục trên, bạn sẽ thấy rằng nó có language_override
đồng ruộng. Cụ thể, nó giống như sau:"language_override" : "language"
Điều đó có nghĩa là language
của tài liệu trường sẽ là trường mà chỉ mục sử dụng để ghi đè ngôn ngữ.
Khi bạn tạo một text
chỉ mục, chỉ mục sẽ tìm kiếm bất kỳ trường nào được gọi là language
và sau đó sử dụng chúng làm ngôn ngữ cho tài liệu tương ứng.
Tuy nhiên, tên language
không được đặt trong đá. Bạn có thể thay đổi nó nếu bạn muốn.
Giả sử bộ sưu tập của chúng ta chứa các tài liệu có tên trường bằng tiếng Đan Mạch.
Như thế này:
{ "_id" : 1, "originalt_navn" : "Family Guy", "sprog" : "english", "oversættelser" : { "sprog" : "german", "sitcom-navn" : "Familienmensch" } } { "_id" : 2, "originalt_navn" : "Cuéntame como pasó", "sprog" : "spanish", "oversættelser" : [ { "sprog" : "english", "sitcom-navn" : "Tell me how it happened" }, { "sprog" : "french", "sitcom-navn" : "Raconte-moi comment cela s'est passé" } ] }
Trong trường hợp này, sprog
là trường xác định ngôn ngữ của mỗi tài liệu.
Do đó, chúng ta có thể tạo chỉ mục như sau:
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish",
"language_override": "sprog"
}
)
Hãy kiểm tra chỉ mục:
db.sitcoms.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "original_name_text_translations.sitcom_name_text", "default_language" : "danish", "language_override" : "sprog", "weights" : { "original_name" : 1, "translations.sitcom_name" : 1 }, "textIndexVersion" : 3 } ]
Trong text
mới được tạo của chúng tôi chỉ mục, chúng ta có default_language
dưới dạng danish
và language_override
trường dưới dạng sprog
.
Các ngôn ngữ có sẵn
Tại thời điểm viết bài, có khoảng 15 ngôn ngữ được hỗ trợ bởi text
chỉ mục và $text
nhà điều hành.
Bạn có thể sử dụng tên ngôn ngữ dạng dài (như trong các ví dụ trên) hoặc mã ngôn ngữ ISO 639-1 gồm hai chữ cái.
Danh sách các ngôn ngữ tìm kiếm văn bản có sẵn trên trang web MongoDB.