一、简介

映射(Mapping):定义了索引中文档的结构,包括字段的数据类型、分析器设置等。映射决定了如何索引和搜索文档中的数据,官方文档之映射

#映射的作用
1.定义字段类型和数据结构
映射定义了字段的数据类型(如text、keyword、integer等),决定了字段如何被索引和搜索。
2.控制数据存储和检索策略
映射决定了文档是如何被存储和检索的,合理的映射可以提高索引的性能和准确性,而不合理的映射可能导致性能下降和结果不准确。
3.灵活性和优化
映射提供了灵活性和优化选项,如是否存储原始值、是否创建doc values等,这些设置可以帮助进行更高效的排序和聚合操作
#常见的数据类型
text:用于全文检索的字符串字段,可以进行分词。
keyword:不进行分词的字符串字段,常用于过滤、排序和聚合。
integer 和 long:整数类型的字段,适合存储整数值。
float 和 double:浮点数类型的字段,适合存储小数值。
boolean:布尔类型的字段,存储true或false值。
date:日期类型的字段,存储日期值。
ip:IPv4和IPv6地址,es会自动将IP地址转换为适合搜索的无符号整数形式。

类型(Type):在Elasticsearch 7.x之前的版本中,一个索引可以包含多个类型,用于存储不同类型的文档。自Elasticsearch 7.0起,单一类型索引成为标准,类型概念已被弃用。

分词器(Analyzer):负责将文本字段分解为词汇单元,并进行标准化处理。分析器在索引和搜索时分别应用于文本,确保查询与索引数据的一致性,官方Text analysis文档。

#分词器的的作用
1.规范化
分词器可以对文本进行预处理,如去除HTML标签、转换大小写、移除停用词等,以确保分词结果的标准化和规范化。
2.语言特异性
针对不同语言,分词器需要遵循特定的语言规则和词典进行分词,以确保分词的准确性和效率1。
3.优化搜索体验
通过合理的分词,可以提高搜索的相关性和准确性,提升用户体验。
#分词器的类型
Standard Analyzer:默认分词器,适用于大多数情况,按词切分并进行小写处理,使用空格和符号进行切割分词。
Whitespace Analyzer:根据空白字符切分文本。
Simple Analyzer:将文本切分成单个字符。
Stop Analyzer:移除文本中的停用词。
Keyword Analyzer:将文本视为一个整体,不进行任何切分,适用于需要精确匹配的场景。
IK:中文分词器。

ik中文分词器的安装,ik版本要与es版本一致,github项目地址

cd /es/softwares/es7/elasticsearch-7.17.5
./bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.5
systemctl restart es7

二、映射举例

0.映射示例

title 字段被定义为 text 类型,用于全文搜索,
author 字段被定义为 keyword 类型,用于精确匹配和排序,
publish_date 字段被定义为 date 类型,用于存储日期,
page_count 字段被定义为 integer 类型,用于存储整数值,
rated 字段被定义为 boolean 类型,用于存储布尔值。
#创建映射
PUT http://192.168.77.176:9200/my_index
#body内容  josn格式
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "author": {
        "type": "keyword"
      },
      "publish_date": {
        "type": "date"
      },
      "page_count": {
        "type": "integer"
      },
      "rated": {
        "type": "boolean"
      }
    }
  }
}

1.创建一个包含ip类型字段的映射

#创建ip类型的映射
PUT http://192.168.77.176:9200/alibaby005-ip
#body内容  josn格式
{
  "mappings": {
    "properties": {
      "ip_address": {
        "type": "ip"
      }
    }
  }
}

ELK日志收集之ES映射与分词器IK中文分词器_映射

2.批量添加IP地址

#批量添加IP地址
POST http://192.168.77.176:9200/alibaby005-ip/_bulk
#body内容  josn格式
{"create":{"_index":"alibaby005-ip"}}
{"ip_address":"192.168.1.1"}
{"create":{"_index":"alibaby005-ip"}}
{"ip_address":"192.168.1.2"}
{"index":{"_index":"alibaby005-ip"}}
{"ip_address":"10.0.0.1"}
{"index":{"_index":"alibaby005-ip"}}
{"ip_address":"10.0.0.2"}

ELK日志收集之ES映射与分词器IK中文分词器_映射_02

3.使用IP地址段进行搜索 

#使用IP地址进行搜索
GET http://192.168.77.176:9200/alibaby005-ip/_search
#body内容  josn格式
{
  "query": {
    "match": {
      "ip_address": "192.168.1.0/24"
    }
  }
}

ELK日志收集之ES映射与分词器IK中文分词器_分词器_03

4.其他类型举例

#创建索引并定义映射
PUT http://192.168.77.176:9200/alibaby005-other
#body内容  josn格式
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "email": {
        "type": "keyword"
      }
    }
  }
}

ELK日志收集之ES映射与分词器IK中文分词器_分词器_04

##批量添加数据
POST http://192.168.77.176:9200/alibaby005-other/_bulk
#body内容  josn格式
{ "index": {}}
{ "name": "John Doe", "age": 30, "email": "john@example.com" }
{ "index": {}}
{ "name": "Jane Doe", "age": 25, "email": "jane@example.com" }
 

ELK日志收集之ES映射与分词器IK中文分词器_IK中文分词器_05

##查询数据 匹配所有
GET http://192.168.77.176:9200/alibaby005-other/_search
#body内容  josn格式
{
  "query": {
    "match_all": {}
  }
}

#查询数据 基于name字段  text类型可分词模糊搜索
GET http://192.168.77.176:9200/alibaby005-other/_search
#body内容  josn格式
{
    "query":{
        "match":{
            "name": "Doe"
        }
    }
}

ELK日志收集之ES映射与分词器IK中文分词器_分词器_06

三、分词器举例

0.分词器示例

在这个例子中,我们创建了一个名为my_index的索引。
我们定义了一个字段text,它的类型是text,并指定了一个自定义分词器my_analyzer。
分词器my_analyzer使用标准分词器my_tokenizer,并应用了小写过滤器lowercase。
这个例子展示了如何在Elasticsearch中定义一个包含自定义分词器的映射。
这对于创建全文搜索功能非常重要,因为分词器决定了文本如何被分割和分析以便于搜索。
#创建索引并定义映射和分词器
PUT http://192.168.77.176:9200/my_index
#body内容  josn格式
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "standard"
        }
      }
    }
  }
}

1.内置默认标准分词器-分析英文

#内置默认标准分词器-分析英文
GET http://192.168.77.176:9200/_analyze
#body内容  josn格式
{
  "text": "The quick brown fox jumps over the lazy dog.",
  "analyzer": "standard"
}

ELK日志收集之ES映射与分词器IK中文分词器_映射_07

2.IK中文分词器

#IK中文分词器-细粒度拆分
GET http://192.168.77.176:9200/_analyze
#body内容  josn格式
{
    "analyzer": "ik_max_word",
    "text": "小学生作文花园的秘密"
}

细粒度拆分分词结果---小学生  小学  学生 

ELK日志收集之ES映射与分词器IK中文分词器_映射_08

#IK中文分词器-粗粒度拆分
GET http://192.168.77.176:9200/_analyze
#body内容  josn格式
{
    "analyzer": "ik_smart",
    "text": "小学生作文花园的秘密"
}

粗粒度拆分分词结果---小学生

ELK日志收集之ES映射与分词器IK中文分词器_分词器_09

3.基于字典的IK中文分词器

#进入ik字典配置目录
cd /es/softwares/es7/elasticsearch-7.17.5/config/analysis-ik
#自定义字典
cat >alibaby007.dic<<'EOF'
游西湖十景
品杭州美食
感杭州人文
EOF
#加载自定义字典
vim IKAnalyzer.cfg.xml
改<entry key="ext_dict"></entry>
为<entry key="ext_dict">alibaby007.dic</entry>
#重启ES集群
systemctl restart es7
#IK中文分词器-粗粒度拆分
GET http://192.168.77.176:9200/_analyze
#body内容  josn格式
{
    "analyzer": "ik_smart",
    "text": "杭州西湖,是中国最著名的风景名胜之一,也是杭州的灵魂所在,国庆节来游西湖十景、品杭州美食、感杭州人文吧。"
}

ELK日志收集之ES映射与分词器IK中文分词器_分词器_10