文档建模 #
文档建模是构建和设计搜索系统时的基础步骤,它决定了数据如何存储和检索。在 Easysearch 中,文档模型的设计不仅影响到搜索的性能,还影响到系统的可扩展性和查询的准确性。
文档结构的设计 #
每个文档在 Easysearch 中由一组字段(Field)组成。文档结构应根据实际应用场景合理设计,不仅要保证搜索精度,还要考虑查询的效率和存储的优化。 • 字段定义:每个字段应根据数据的实际意义选择合适的字段类型(如文本、数字、日期等)。选择合适的字段类型有助于提高搜索的精度和性能。 • 字段顺序与索引:不同的字段可能需要不同的索引策略,例如某些字段可能需要精确匹配,而另一些字段则使用全文检索。合理安排字段的顺序和索引方式能够在数据量增长时保持良好的性能。
数据源与文档映射 #
Easysearch 支持从多种数据源(如数据库、文件系统等)导入数据。在将数据导入到索引之前,需要进行文档映射,定义如何将源数据转化为搜索系统能理解和处理的格式。 • 自动映射与手动映射:根据数据源的类型,Easysearch 提供了自动映射的功能,也支持开发者手动定义字段与索引的关系。手动映射可以帮助你优化查询性能,避免不必要的字段索引。
映射用于告诉 Easysearch 如何存储和索引您的文档和字段。您可以为每个字段指定数据类型(例如,year
作为 date
),这样可以让数据存储和查询更高效。
虽然动态映射会自动添加新数据和字段,但建议使用显式映射。显式映射允许您提前定义确切的结构和数据类型。这有助于保持数据一致性并优化性能,特别是对于大型数据集的索引操作。
例如,使用显式映射,您可以确保 year
被视为文本,而 age
被视为整数,而不是都动态映射为整数。
动态映射 #
当 Easysearch 遇到文档中的新字段时,它会使用动态映射来确定字段的数据类型并自动添加字段到映射中。
动态映射类型 #
类型 | 描述 |
---|---|
null | 一个 null 字段不能被索引或搜索。当一个字段被设置为 null 时,Easysearch 的行为就像该字段没有值一样。 |
boolean | Easysearch 接受 true 和 false 作为布尔值。空字符串等同于 false。 |
float | 单精度 32 位浮点数。 |
double | 双精度 64 位浮点数。 |
integer | 有符号 32 位整数。 |
object | 对象是标准的 JSON 对象,可以有自己的字段和映射。例如,一个 movies 对象可以有额外的属性,如 title 、year 和 director 。 |
array | Easysearch 没有特定的数组数据类型。数组被表示为与字段相关联的相同数据类型的值集。在索引时,您可以为字段传递多个值,Easysearch 会将其视为数组。 |
text | 表示全文值的字符序列。 |
keyword | 表示结构化字符序列的字符串,例如电子邮件地址或邮政编码。 |
日期检测字符串 | 默认启用,如果新字符串字段匹配日期格式,则该字符串将被处理为日期字段。例如,date: "2012/03/11" 被处理为日期。 |
数值检测字符串 | 如果禁用,Easysearch 可能会自动将数值处理为字符串。当启用时,Easysearch 可以将字符串处理为数值类型。默认禁用。 |
动态模板 #
动态模板允许您定义自定义映射规则,这些规则基于字段名称的模式匹配或数据类型来应用。
例如:
PUT sample-index1
{
"mappings": {
"dynamic_templates": [
{
"status_fields": {
"match": "status*",
"match_mapping_type": "string",
"mapping": {
"type": "short"
}
}
}
]
}
}
此映射配置动态地将任何以 status
开头的字段映射到短整型,即便是索引时提供的初始值是字符串。
动态映射参数 #
以下是可用的动态映射参数:
参数 | 描述 |
---|---|
match_mapping_type | 指定触发映射的 JSON 数据类型。 |
match | 用于匹配字段名称的正则表达式。 |
unmatch | 用于排除字段名称的正则表达式。 |
match_pattern | 确定模式匹配行为。 |
path_match | 允许匹配嵌套字段路径。 |
path_unmatch | 排除嵌套字段路径。 |
mapping | 要应用的映射配置。 |
显式指定映射 #
如果您知道需要使用的确切字段数据类型,则可以在创建索引时在请求正文中指定它们:
PUT sample-index1
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" }
}
}
}
要将映射添加到现有索引,您可以向 _mapping API 发送下面的请求:
POST sample-index1/_mapping
{
"properties": {
"employee-id": {
"type": "keyword",
"index": false
}
}
}
映射参数 #
映射参数用于配置字段的索引行为。
映射限制设置 #
Easysearch 有一些可以根据需求配置的映射限制:
设置 | 默认值 | 描述 |
---|---|---|
index.mapping.nested_fields.limit | 50 | 限制嵌套字段的最大数量。 |
index.mapping.nested_objects.limit | 10,000 | 限制嵌套对象的最大数量。 |
index.mapping.total_fields.limit | 1,000 | 限制字段的最大数量。 |
index.mapping.depth.limit | 20 | 限制嵌套对象的最大深度。 |
index.mapping.field_name_length.limit | 50,000 | 限制字段名称的最大长度。 |
获取映射 #
要获取索引的映射,请使用:
GET /sample-index1/_mapping
示例 #
忽略格式错误的 IP 地址 #
创建一个可以忽略错误格式 IP 字段索引:
PUT /test-index
{
"mappings": {
"properties": {
"ip_addr": {
"type": "ip",
"ignore_malformed": true
}
}
}
}
将字符串映射成文本和关键字字段 #
创建带有字符串动态映射模板的索引:
PUT movies1
{
"mappings": {
"dynamic_templates": [
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
]
}
}