一、简介
映射(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"
}
}
}
}
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"}
3.使用IP地址段进行搜索
#使用IP地址进行搜索
GET http://192.168.77.176:9200/alibaby005-ip/_search
#body内容 josn格式
{
"query": {
"match": {
"ip_address": "192.168.1.0/24"
}
}
}
4.其他类型举例
#创建索引并定义映射
PUT http://192.168.77.176:9200/alibaby005-other
#body内容 josn格式
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"email": {
"type": "keyword"
}
}
}
}
##批量添加数据
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" }
##查询数据 匹配所有
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"
}
}
}
三、分词器举例
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"
}
2.IK中文分词器
#IK中文分词器-细粒度拆分
GET http://192.168.77.176:9200/_analyze
#body内容 josn格式
{
"analyzer": "ik_max_word",
"text": "小学生作文花园的秘密"
}
细粒度拆分分词结果---小学生 小学 学生
#IK中文分词器-粗粒度拆分
GET http://192.168.77.176:9200/_analyze
#body内容 josn格式
{
"analyzer": "ik_smart",
"text": "小学生作文花园的秘密"
}
粗粒度拆分分词结果---小学生
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": "杭州西湖,是中国最著名的风景名胜之一,也是杭州的灵魂所在,国庆节来游西湖十景、品杭州美食、感杭州人文吧。"
}