• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

ElasticSearch系列 - SpringBoot整合ES映射定义字段的数据类型和属性

武飞扬头像
我一直在流浪
帮助1


ElasticSearch - SpringBoot整合ES:映射定义字段的数据类型及属性

01. ElasticSearch 搜索结果的准确性和召回率是什么?

在Elasticsearch中,搜索结果的准确性和召回率是非常重要的指标,它们反映了搜索引擎的性能和效果。以下是这两个指标的定义和解释:

准确性:搜索结果的准确性是指搜索引擎返回的结果中有多少是与查询字符串相关的。如果搜索结果中包含大量与查询字符串无关的文档,那么搜索引擎的准确性就会降低。

召回率:搜索结果的召回率是指搜索引擎返回的结果中有多少是与查询字符串相关的文档的比例。如果搜索引擎无法找到与查询字符串相关的文档,那么搜索引擎的召回率就会降低。

02. ElasticSearch 字段支持的数据类型有哪些?

在Elasticsearch中,每个字段都有一个数据类型,用于指定该字段可以存储的数据类型,以下是Elasticsearch支持的数据类型:

  • 字符串类型: textkeyword
  • 整数类型 : byte, short, integer, long
  • 浮点数类型: float, double
  • 布尔型类型: boolean
  • 日期类型: `date

03. ElasticSearch 映射是什么?

Elasticsearch映射是指将文档中的字段定义为特定类型的过程。在Elasticsearch中,每个文档都有一个映射,它定义了文档中包含的字段以及每个字段的数据类型。映射还可以定义字段的分析器、索引选项和其他属性。

映射对于搜索和聚合非常重要,因为它们确定了如何处理和解释文档中的数据。例如,如果一个字段被定义为字符串类型,那么它将被分析成单词,并且可以使用全文搜索来查找包含特定单词的文档。如果一个字段被定义为数字类型,那么它可以用于聚合操作,如计算平均值或最大值。

映射还可以包含动态映射,这允许Elasticsearch自动检测新字段并将它们添加到映射中。这对于处理不断变化的数据非常有用。

04. ElasticSearch 动态映射是什么?

在Elasticsearch中,动态映射是一种自动创建索引映射的机制,可以根据添加的文档自动创建索引映射。当添加一个新的文档时,如果该文档包含一个之前不存在的字段,Elasticsearch会自动创建一个新的字段,并根据该字段的值推断出该字段的数据类型,并将其添加到索引映射中。

在一般情况下,如果使用基本类型数据,最好先把数据类型定义好,因为ES的动态映射生成的字段类型可能会与用户的预期有差别。例如,写入数据时,由于ES对于未定义的字段没有类型约束,如果同一字段的数据形式不同(有的是字符型,有的是数值型),则ES动态映射生成的字段类型和用户的预期可能会有偏差。

① 索引一个文档:

PUT /my_index/_doc/1
{
  "title": "金都时尚情侣浪漫主题酒店",
  "content": "山东省青岛市",
  "price": 337
}

② 查看索引映射,ElasticSearch会自动创建索引映射:

GET /my_index/_mapping
{
  "my_index" : {
    "mappings" : {
      "properties" : {
        "content" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "price" : {
          "type" : "long"
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

05. ElasticSearch 字段的属性有哪些?

在Elasticsearch中,每个字段都有一组属性,这些属性定义了如何处理和存储该字段的数据。以下是一些常见的字段属性:

  • 数据类型:定义了字段中存储的数据类型,例如字符串、数字、日期等。
  • 分析器:定义了如何将文本数据分解为单词,以便进行全文搜索和聚合操作。
  • 索引选项:定义了是否将字段的值存储在倒排索引中,以便进行搜索和聚合操作。
  • 存储选项:定义了是否将字段的原始值存储在文档中,以便进行检索和显示。
  • 多字段:定义了将一个字段分成多个子字段的方式,以便进行不同类型的搜索和聚合操作。
  • 动态映射:定义了如何处理新字段,以便自动将它们添加到映射中。
  • 复杂类型:定义了如何处理包含多个值或嵌套对象的字段,例如数组、对象和嵌套字段。

这些属性可以在映射中定义,并且可以根据需要进行修改。通过定义正确的属性,可以最大限度地利用Elasticsearch的搜索和聚合功能,并且可以确保数据被正确地存储和处理。

06. ElasticSearch 映射中可以指定字段的哪些属性?

在Elasticsearch中,mapping是用于定义索引中字段的数据类型、分词器、索引选项等信息的一种方式。在mapping中,每个字段都有一些属性,以下是一些常用的属性:

  • type:用于指定字段的数据类型,例如text、keyword、date、long等。
  • index:用于指定字段是否需要被索引,可以设置为true或false。如果将一个字段的index属性设置为false,则该字段不会被索引,也就无法进行全文搜索等操作。
  • analyzer:用于指定分词器,可以指定内置分词器,也可以自定义分词器。
  • search_analyzer:用于指定搜索时使用的分词器,如果不指定,则使用analyzer属性指定的分词器。
  • fields:用于指定多个不同的索引选项,例如可以为一个字段指定多个不同的分词器。
  • format:用于指定日期类型字段的日期格式。
  • store:用于指定是否将字段的原始值存储在索引中,可以设置为true或false。如果将一个字段的store属性设置为true,则该字段的原始值会被存储在索引中,可以通过_source字段获取。
  • copy_to:用于将多个字段的值合并到一个字段中进行搜索,可以指定多个字段。
  • ignore_above:用于指定文本类型字段的最大长度,超过该长度的文本将被忽略。
  • ignore_malformed:用于指定数值类型字段是否忽略格式错误的值,可以设置为true或false。
  • coerce:用于指定数值类型字段是否将字符串类型的值转换为数值类型,可以设置为true或false。
  • null_value:用于指定字段的默认值,如果字段的值为null,则使用该默认值。

以上是一些常用的字段属性,不同的数据类型可能支持不同的属性。在创建索引时,可以根据需要指定不同的属性来定义索引映射。

07. ElasticSearch 映射中指定字段的属性 type?

type属性用于指定字段的数据类型。Elasticsearch支持多种数据类型,包括文本类型、数值类型、日期类型、地理位置类型等。例如,以下是一个包含text类型字段和keyword类型字段的索引映射:

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "keyword_field": {
        "content": "keyword"
      }
    }
  }
}

08. ElasticSearch 映射中指定字段的属性 index?

index属性用于指定字段是否需要被索引。如果将一个字段的index属性设置为false,则该字段不会被索引,也就无法进行全文搜索等操作。

① 创建索引并指定映射,其中 content 字段的index属性被设置为false,因此该字段不会被索引。

PUT my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "content": {
        "type": "keyword",
        "index": false
      }
    }
  }
}

② 索引文档:

PUT /my_index/_doc/1
{
  "title": "文轩酒店",
  "content": "蚌埠"
}

③ 检索文档:

GET /my_index/_search
{
  "query": {
    "term": {
      "content": {
        "value": "蚌埠"
      }
    }
  }
}

报错:

"caused_by": {
    "type": "illegal_argument_exception",
    "reason": "Cannot search on field [content] since it is not indexed."
}

这个错误通常表示您正在尝试搜索一个未被索引的字段。在Elasticsearch中,只有被索引的字段才能被搜索。如果您尝试搜索未被索引的字段,就会出现这个错误。

要解决这个问题,您需要确保您要搜索的字段已经被正确地索引。您可以通过检查映射来确定字段是否被索引。在映射中,每个字段都有一个索引选项,它指定了该字段是否应该被索引。如果索引选项设置为false,那么该字段将不会被索引,也就无法被搜索。

09. ElasticSearch 映射中指定字段的属性 analyzer和search_analyzer?

在Elasticsearch中,映射中的字段可以定义一个analyzer和一个search_analyzer属性。这两个属性定义了在索引和搜索时如何分析和处理字段中的文本数据。

analyzer属性定义了在索引时如何分析文本数据。它指定了一个分析器,该分析器将文本数据分解为单词,并将这些单词存储在倒排索引中。当您搜索文本时,Elasticsearch将使用相同的分析器来分析查询字符串,并将其转换为与索引中存储的单词相匹配的查询项。

search_analyzer属性定义了在搜索时如何分析查询字符串。它指定了一个分析器,该分析器将查询字符串分解为单词,并将这些单词与倒排索引中的单词进行匹配。这使得您可以使用不同的分析器来索引和搜索文本数据,从而更好地控制搜索结果的准确性和召回率。

例如,如果您的字段包含英文文本,您可以使用一个英文分析器来索引该字段,以便将文本分解为单词,并将这些单词存储在倒排索引中。然后,您可以使用一个不同的分析器来搜索该字段,例如一个停用词过滤器,以便排除常见的单词,从而提高搜索结果的准确性。

总之,analyzer和search_analyzer属性是Elasticsearch映射中非常重要的属性,它们定义了如何处理和分析文本数据,并影响搜索结果的准确性和召回率。

需要注意的是,analyzer和search_analyzer属性只对文本类型的字段有效,对于其他类型的字段,这些属性会被忽略。

PUT /my_index
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "english",
        "search_analyzer": "english"
      }
    }
  }
}

在这个示例中,"content"字段被定义为一个"text"类型的字段,它使用了一个名为"english"的分析器来分析文本数据。这个分析器将文本分解为单词,并将这些单词存储在倒排索引中。同时,“content"字段的search_analyzer属性也被设置为"english”,这意味着在搜索时将使用相同的分析器来分析查询字符串。

您可以根据需要定义不同的分析器,并将它们分配给不同的字段。例如,如果您的字段包含中文文本,您可以使用一个中文分析器来索引该字段,并使用一个不同的分析器来搜索该字段,以便更好地控制搜索结果的准确性和召回率。

10. ElasticSearch 映射中指定字段的属性 fields?

在Elasticsearch中,映射中的字段可以定义一个fields属性,该属性允许您为同一个字段定义多个不同的索引选项和分析器。这使得您可以在同一个字段上执行多种不同类型的搜索和聚合操作,从而更好地控制搜索结果的准确性和召回率。

PUT /my_index
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "fields": {
          "english": {
            "type": "text",
            "analyzer": "english"
          },
          "ik_max_word": {
            "type": "text",
            "analyzer": "ik_max_word"
          }
        }
      }
    }
  }
}

在这个示例中,"content"字段被定义为一个"text"类型的字段,并且定义了一个fields属性。该属性包含了两个子字段,“english"和"ik_max_word”,它们分别使用了不同的分析器来分析文本数据。这意味着您可以使用不同的分析器来搜索和聚合这两个子字段,从而更好地控制搜索结果的准确性和召回率。

要使用fields属性,您可以在搜索查询中指定要搜索的子字段。例如,如果您要搜索包含英文文本的"content"字段,您可以使用以下查询:

GET /my_index/_search
{
  "query": {
    "match": {
      "content.english": "some english text"
    }
  }
}

在这个查询中,"content.english"指定了要搜索的子字段,它使用了英文分析器来分析查询字符串和文本数据。

同样,如果您要搜索包含中文文本的"content"字段,您可以使用以下查询:

GET /my_index/_search
{
  "query": {
    "match": {
      "content.ik_max_word": "some chinese text"
    }
  }
}

在这个查询中,"content.ik_max_word"指定了要搜索的子字段,它使用了中文ik分析器来分析查询字符串和文本数据。

总之,通过定义fields属性,您可以为同一个字段定义多个不同的索引选项和分析器,从而更好地控制搜索结果的准确性和召回率。

11. ElasticSearch 映射中指定字段的属性 fromat?

在Elasticsearch中,映射中的字段可以定义一个format属性,该属性指定了字段中存储的日期、时间或数字的格式。这使得Elasticsearch可以正确地解析和处理这些数据,并在搜索和聚合操作中使用它们。

① 以下是一个示例映射定义,其中包含了一个名为"date"的字段,该字段定义了一个format属性:

PUT /my_index
{
  "mappings": {
    "properties": {
      "createTime": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}

在这个示例中,“createTime"字段被定义为一个"date"类型的字段,并且定义了一个format属性。该属性指定了日期和时间的格式,即"yyyy-MM-dd HH:mm:ss”。这意味着当您将日期和时间存储在"createTime"字段中时,Elasticsearch将使用这个格式来解析和处理它们。

要使用format属性,您可以在搜索查询中指定要搜索的日期、时间或数字的格式。例如,搜索包含特定日期的"createTime"字段:

GET /my_index/_search
{
  "query": {
    "match": {
      "createTime": "2023-03-28 12:00:00"
    }
  }
}

② 您可以使用不同的格式来定义不同类型的日期、时间和数字。例如,如果您要存储一个UNIX时间戳,您可以使用以下映射定义:

PUT /my_index
{
  "mappings": {
    "properties": {
      "createTime": {
        "type": "date",
        "format": "epoch_millis"
      }
    }
  }
}

在这个示例中,“createTime"字段被定义为一个"date"类型的字段,并且定义了一个format属性。该属性指定了UNIX时间戳的格式,即"epoch_millis”。这意味着当您将UNIX时间戳存储在"createTime"字段中时,Elasticsearch将使用这个格式来解析和处理它们。

如果您要搜索包含特定UNIX时间戳的"createTime"字段,您可以使用以下查询:

GET /my_index/_search
{
  "query": {
    "match": {
      "createTime": 1616947200000
    }
  }
}

总之,通过使用format属性,您可以为Elasticsearch定义不同类型的日期、时间和数字的格式,从而使Elasticsearch能够正确地解析和处理这些数据,并在搜索和聚合操作中使用它们。

12. ElasticSearch 映射中指定字段的属性 null_value?

在Elasticsearch中,映射中的字段可以定义一个null_value属性,该属性指定了当字段中的值为null时应该使用的默认值。这使得您可以更好地控制搜索结果和聚合操作中的null值,并确保它们不会影响搜索结果的准确性和召回率。

以下是一个示例映射定义,其中包含了一个名为"price"的字段,该字段定义了一个null_value属性:

PUT /my_index
{
  "mappings": {
    "properties": {
      "price": {
        "type": "float",
        "null_value": 0.0
      }
    }
  }
}

在这个示例中,"price"字段被定义为一个"float"类型的字段,并且定义了一个null_value属性。该属性指定了当"price"字段中的值为null时应该使用的默认值,即0.0。

您可以使用不同的默认值来定义不同类型的字段。例如,如果您要定义一个字符串字段,并且希望在该字段中的值为null时使用一个默认值,您可以使用以下映射定义:

PUT /my_index
{
  "mappings": {
    "properties": {
      "description": {
        "type": "text",
        "null_value": "No description available"
      }
    }
  }
}

在这个示例中,“description"字段被定义为一个"text"类型的字段,并且定义了一个null_value属性。该属性指定了当"description"字段中的值为null时应该使用的默认值,即"No description available”。

总之,通过使用null_value属性,您可以为Elasticsearch定义不同类型的字段的默认值,并确保在搜索结果和聚合操作中不会受到null值的影响。

13. ElasticSearch 日期型数据的默认数据格式是什么?

在Elasticsearch中,日期型数据的默认格式是ISO 8601格式,即yyyy-MM-dd’T’HH:mm:ss.SSSZ。其中,yyyy表示年份,MM表示月份,dd表示日期,HH表示小时,mm表示分钟,ss表示秒,SSS表示毫秒,Z表示时区。

例如,以下是一个包含日期型数据的文档:

PUT my_index/_doc/1
{
  "date_field": "2023-03-28T12:00:00Z"
}

在上面的示例中,date_field字段包含了一个ISO 8601格式的日期字符串。

当然,Elasticsearch也支持其他日期格式,可以在创建索引映射时指定日期格式。例如,以下是一个包含自定义日期格式的索引映射:

PUT my_index
{
  "mappings": {
    "properties": {
      "date_field": {
        "type": "date",
        "format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd"
      }
    }
  }
}

14. ElasticSearch 字段的数据类型 date?

在Elasticsearch中,可以使用date类型来存储日期型数据,并且可以指定日期格式。如果要使用yyyy-mm-dd HH:mm:ss格式来存储日期型数据,可以按照以下步骤进行操作。

① 创建一个包含date类型字段的索引映射

在创建索引时,需要指定该索引包含一个date类型的字段,并且指定日期格式为yyyy-MM-dd HH:mm:ss。例如,以下是一个包含date类型字段的索引映射:

PUT my_index
{
  "mappings": {
    "properties": {
      "lastTime": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}

在上面的示例中,lastTime字段的日期格式为yyyy-MM-dd HH:mm:ss。

② 添加文档时,将日期型数据转换为指定格式的字符串

在添加文档时,需要将日期型数据转换为指定格式的字符串,然后将其存储在date类型字段中。例如,以下是一个包含日期型数据的文档:

PUT my_index/_doc/1
{
  "lastTime": "2023-03-28 12:00:00"
}

在上面的示例中,lastTime字段包含了一个yyyy-MM-dd HH:mm:ss格式的日期字符串。

③ 查询日期型数据

在查询日期型数据时,可以使用ElasticSearch提供的日期范围查询、日期区间查询等查询方式。例如,以下是一个查询lastTime字段值在2023年3月1日到3月31日之间的文档的查询语句:

GET my_index/_search
{
  "query": {
    "range": {
      "date_field": {
        "gte": "2023-03-01 00:00:00",
        "lte": "2023-03-31 23:59:59"
      }
    }
  }
}

在上面的示例中,range查询用于查询date_field字段值在指定范围内的文档。gte参数表示大于等于指定日期,lte参数表示小于等于指定日期。注意,在查询时也需要使用指定格式的日期字符串。

15. ElasticSearch 字段的数据类型 text?

在 ElasticSearch 中,文本类型 text 是一种用于存储文本的数据类型。text 类型会对文本进行分词处理,将文本分成一个个词条,然后将这些词条存储到倒排索引中,以便进行全文搜索。

由于text 类型会对文本进行分词处理,因此在进行查询时,需要使用全文搜索查询方式(如 match 查询、multi_match 查询等),而不能使用精确匹配查询方式(如 term 查询、terms 查询等)。

例如:根据我们构造的数据,content 字段为 text 类型,且数据库中存在数据:

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "keyword"
      },
      "content": {
        "type": "text"
      },
      "price":{
        "type": "long"
      }
    }
  }
}
PUT /my_index/_doc/1
{
  "title": "金都时尚情侣浪漫主题酒店",
  "content": "山东省青岛市",
  "price": 337
}

使用全文检索 match查询,查询结果为:

GET /my_index/_search
{
  "query": {
    "match": {
      "content": "山东省青岛市"
    }
  }
}
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : 5.805786,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 5.805786,
        "_source" : {
          "title" : "金都时尚情侣浪漫主题酒店",
          "content" : "山东省青岛市",
          "price" : 337
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.5889417,
        "_source" : {
          "title" : "金都欣欣24小时酒店",
          "content" : "安徽省淮北市",
          "price" : 200
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 0.5889417,
        "_source" : {
          "title" : "自如酒店",
          "content" : "江苏省南京市",
          "price" : 400
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.10522305,
        "_source" : {
          "title" : "金都嘉怡假日酒店",
          "content" : "北京市",
          "price" : 337
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 0.08840232,
        "_source" : {
          "title" : "金都自如酒店",
          "content" : "上海直辖市",
          "price" : 300
        }
      }
    ]
  }
}

如果使用精确匹配 term 查询,则查不到任何结果:

GET /my_index/_search
{
  "query": {
    "term": {
      "content": {
        "value": "山东省青岛市"
      }
    }
  }
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

因此,由于 text 类型会对文本进行分词处理,因此在进行查询时,需要使用全文搜索查询方式(如 match 查询、multi_match 查询等),而不能使用精确匹配查询方式(如 term 查询、terms 查询等)。

16. ElasticSearch 字段的数据类型 keyword?

在 ElasticSearch 中,字符串类型 keyword 是一种用于存储精确值的数据类型。keyword 类型不会对文本进行分词处理,而是将整个文本作为一个词条进行索引,以便进行精确匹配查询。

由于 keyword 类型不会对文本进行分词处理,因此在进行查询时,需要使用精确匹配查询方式(如 term 查询、terms 查询等),而不能使用全文搜索查询方式(如 match 查询、multi_match 查询等)。

例如:根据我们构造的数据,title 字段为 keyword 类型,且数据库中存在数据:

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "keyword"
      },
      "content": {
        "type": "text"
      },
      "price":{
        "type": "long"
      }
    }
  }
}
PUT /my_index/_doc/1
{
  "title": "金都时尚情侣浪漫主题酒店",
  "content": "山东省青岛市",
  "price": 337
}

使用精确匹配 term 查询,查询结果为:

GET /my_index/_search
{
  "query": {
    "term": {
      "title": {
        "value": "金都时尚情侣浪漫主题酒店"
      }
    }
  }
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.3862944,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.3862944,
        "_source" : {
          "title" : "金都时尚情侣浪漫主题酒店",
          "content" : "山东省青岛市",
          "price" : 337
        }
      }
    ]
  }
}

17. ElasticSearch 字段的数据类型 boolean?

在Elasticsearch中,布尔类型用于存储布尔值(true或false)。布尔类型的字段可以用于精确匹配、聚合和过滤操作。

以下是一个示例映射定义,其中包含了一个名为"active"的布尔类型字段:

PUT /my_index
{
  "mappings": {
    "properties": {
      "active": {
        "type": "boolean"
      }
    }
  }
}

在这个示例中,"active"字段被定义为一个布尔类型的字段。

要索引和创建布尔值,您可以使用以下示例请求:

PUT /my_index/_doc/1
{
  "active": true
}

在这个请求中,"active"字段指定了要索引和创建的布尔值,它的值为true。

18. ElasticSearch 字段的数据类型: 数组类型?

ES数组没有定义方式,其使用方式是开箱即用的,即无须事先声明,在写入时把数据用中括号[]括起来,由ES对该字段完成定义。当然,如果事先已经定义了字段类型,在写数据时以数组形式写入,ES也会将该类型转为数组。

① 为my_index索引增加一个tags字段:

PUT /my_index
{
  "mappings": {
    "properties": {
      "tags": {
        "type": "keyword"
      }
    }
  }
}

② 索引和创建数组类型的字段:

PUT /my_index/_doc/1
{
  "tags": ["tag1", "tag2", "tag3"]
}

在这个请求中,"tags"字段指定了要索引和创建的数组类型的值,它包含了三个元素。

③ 数组类型的字段适用于元素类型的搜索方式,也就是说,数组元素适用于什么搜索,数组字段就适用于什么搜索。例如,在上面的示例中,数组元素类型是keyword,该类型可以适用于term搜索,则tags字段也可以适用于term搜索,搜索的DSL如下:

GET /hotel/_search 
{ 
  "query": { 
   "term": {             //使用term搜索数组类型的数据 
      "tags": { 
        "value": "tag1" 
      } 
    } 
  } 
}

在这个查询中,“tags"字段指定了要搜索的数组型数据,它的值为"tag1”。这个查询将返回所有"tags"数组中包含"tag1"的文档。

{
  "took" : 960,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.3955629,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.3955629,
        "_source" : {
          "tags" : [
            "tag1",
            "tag2",
            "tag3"
          ]
        }
      }
    ]
  }
}

19. ElasticSearch 字段的数据类型 object?

在Elasticsearch中,对象类型用于存储复杂的结构化数据。对象类型的字段可以包含多个子字段,并且可以用于搜索、聚合和过滤操作。

以下是一个示例映射定义,其中包含了一个名为"person"的对象类型字段:

PUT /my_index
{
  "mappings": {
    "properties": {
      "person": {
        "type": "object",
        "properties": {
          "name": {
            "type": "text"
          },
          "age": {
            "type": "integer"
          },
          "address": {
            "type": "text"
          }
        }
      }
    }
  }
}

在这个示例中,“person"字段被定义为一个对象类型的字段,并且包含了三个子字段,即"name”、“age"和"address”。

要索引和创建对象类型的字段,您可以使用以下示例请求:

PUT /my_index/_doc/1
{
  "person": {
    "name": "John Doe",
    "age": 30,
    "address": "123 Main St"
  }
}

在这个请求中,"person"字段指定了要索引和创建的对象类型的值,它包含了三个子字段。

您可以在搜索查询中使用对象类型的字段进行过滤和聚合操作。例如,如果您要搜索所有年龄大于等于30岁的人,您可以使用以下查询:

GET /my_index/_search
{
  "query": {
    "range": {
      "person.age": {
        "gte": 30
      }
    }
  }
}

在这个查询中,"person.age"字段指定了要过滤的字段,它的值大于等于30。

20. ElasticSearch 字符串类型和文本类型的区别?

在Elasticsearch中,字符串类型和文本类型是两种不同的数据类型,它们在索引和搜索时有一些区别。

字符串类型是未经分词的字符串,它们被视为单个词项,并且可以用于精确匹配和范围查询。字符串类型的字段可以映射为keyword类型或text类型。如果将字段映射为keyword类型,则该字段将被视为未经分词的字符串,可以用于精确匹配和范围查询。如果将字段映射为text类型,则该字段将被视为经过分词器处理的文本,可以用于全文搜索和短语匹配。

文本类型是经过分词器处理的文本,它们被拆分成多个词项,并且可以用于全文搜索和短语匹配。文本类型的字段只能映射为text类型。

以下是一些字符串类型和文本类型的区别:

字符串类型可以用于精确匹配和范围查询,而文本类型可以用于全文搜索和短语匹配。
字符串类型的字段可以映射为keyword类型或text类型,而文本类型的字段只能映射为text类型。
字符串类型的字段被视为单个词项,而文本类型的字段被拆分成多个词项。
字符串类型的字段不会被分词器处理,而文本类型的字段会被分词器处理。

总之,字符串类型和文本类型是两种不同的数据类型,它们在索引和搜索时有一些区别。您需要根据具体的需求选择适合的数据类型。

21. ElasticSearch 如何扩展映射?

映射中的字段类型是不可以修改的,但是字段可以扩展。最常见的扩展方式是增加字段和为object(对象)类型的数据新增属性。

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "content": {
        "type": "keyword"
      }
    }
  }
}

如下,向my_index索引中增加字段tag:

POST /my_index/_mapping 
{ 
  "properties": { 
    "tag": {                  
      "type": "keyword" 
    } 
  } 
}

查询索引映射:

GET /my_index/_mapping
{
  "my_index" : {
    "mappings" : {
      "properties" : {
        "content" : {
          "type" : "keyword"
        },
        "tag" : {
          "type" : "keyword"
        },
        "title" : {
          "type" : "text"
        }
      }
    }
  }
}

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggeckg
系列文章
更多 icon
同类精品
更多 icon
继续加载