赞
踩
在Elasticsearch中,Mapping定义了索引中每个字段的类型、属性以及设置。Mapping的作用是告诉Elasticsearch如何索引文档中的字段,包括如何分析字段值以及如何存储它们。
text:文本类型,存储的内容会被分词器处理,生成多个词根并存储在倒排索引中,支持全文搜索。
keyword:关键字类型,存储的内容不会被分词器处理,整个内容被当作一个词根存储在倒排索引中,支持精确值搜索。
数字类型
存储日期格式的字符串或自1970-01-01以来的毫秒数。
取值为true、false或"true"、"false"。
支持integer_range、float_range、double_range、date_range、ip_range等范围类型。
地理坐标类型(geo_point):用于存储地理坐标点。
地理地图(geo_shape):用于存储复杂地理形状,如多边形、线等。
- IP类型(ip):用于存储IP地址。
- completion类型:使用fst有限状态机来提供suggest前缀查询功能。
- token_count类型:提供token级别的计数功能。
- mapper-murmur3类型:安装插件后,可支持_size统计_source数据的大小。
- attachment类型:用于索引文件附件的内容。
- percolator类型:用于预定义的查询条件与文档进行匹配。
用于存储二进制数据,存储前需要先用Base64进行编码。
PUT /mall-shop_1 { "mappings": { "properties": { "id":{ "type":"keyword" }, "title":{ "type":"text" }, "price":{ "type":"float" } } } }
text字段类型
text类型主要用于全文本搜索,适合存储需要进行全文本分词的文本内容,如文章、新闻等。
text字段会对文本内容进行分词处理,将文本拆分成独立的词项(tokens)进行索引
分词的结果会建立倒排索引,使搜索更加灵活和高效。
text字段在搜索时会根据分词结果进行匹配,并计算相关性得分,以便返回最佳匹配的结果。
keyword字段类型
keyword类型主要用于精确匹配和聚合操作,适合存储不需要分词的精确值,如ID、标签、关键字等。
keyword字段不会进行分词处理,而是将整个字段作为一个整体进行索引和搜索
这使得搜索只能从精确的值进行匹配,而不能根据词项对内容进行模糊检索。
keyword字段适合用于过滤和精确匹配,同时可以进行快速的基于精确值的聚合操作。
总结
在选择text字段类型和keyword字段类型时,需要根据具体的需求进行权衡和选择:
如果需要进行全文本检索,并且希望根据分词结果计算相关性得分,以获得最佳的匹配结果,则选择text字段类型。
如果需要进行精确匹配、排序或聚合操作,并且不需要对内容进行分词,则选择keyword字段类型。
PUT /mall-shop_2 { "mappings": { "properties": { "title":{ "type": "text" }, "tags":{ "type": "keyword" }, "publish_date":{ "type": "date" }, "rating":{ "type": "float" }, "is_published":{ "type": "boolean" }, "author":{ "properties": { "name":{ "type":"text" }, "age":{ "type":"integer" } } }, "comments":{ "type": "nested", "properties": { "user":{ "type":"keyword" }, "message":{ "type":"text" } } } } } }
PUT /mall-shop_2/_doc/1 { "title":"study elasticsearch 8.4.1", "tags":["study","elasticsearch","kibana"], "publish_date":"2024-06-24", "rating":4.5, "is_published":true, "author":{ "name":"lifly", "age":18 }, "comments":[ { "user":"jack", "message":"hi my name is jack" }, { "user":"tom", "message":"hello everyone ,I am tom" } ] }
GET /mall-shop_2/_mapping
查询结果
{ "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "mall-shop_2", "_id": "1", "_score": 1, "_source": { "title": "study elasticsearch 8.4.1", "tags": [ "study", "elasticsearch", "kibana" ], "publish_date": "2024-06-24", "rating": 4.5, "is_published": true, "author": { "name": "lifly", "age": 18 }, "comments": [ { "user": "jack", "message": "hi my name is jack" }, { "user": "tom", "message": "hello everyone ,I am tom" } ] } } ] } }
根据关键词查询
GET /mall-shop_2/_search { "query": { "match": { "title": "elasticsearch" } } } ``` **查询结果** ```shell { "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 0.2876821, "hits": [ { "_index": "mall-shop_2", "_id": "1", "_score": 0.2876821, "_source": { "title": "study elasticsearch 8.4.1", "tags": [ "study", "elasticsearch", "kibana" ], "publish_date": "2024-06-24", "rating": 4.5, "is_published": true, "author": { "name": "lifly", "age": 18 }, "comments": [ { "user": "jack", "message": "hi my name is jack" }, { "user": "tom", "message": "hello everyone ,I am tom" } ] } } ] } }
分词即使将文本拆分成单独的单次或词项的过程
分词是搜索引擎在建立索引和执行查询时的关键步骤,将文本拆分成单词,并构建倒排索引,可以实现更好的搜索和检索效果。
分词规则是指如何将文本进行拆分的规则和算法。
elasticsearch使用一些列的分词器(analyzer)和标记器(tokenizer)来处理文本内容。
标记化(Tokenization):
分词的第一步是将文本内容拆分成单个标记(tokens),标记可以是单词、数字、特殊字符等。
标记化过程由标记器(tokenizer)执行,标记器根据一组规则将文本切分为标记。
过滤(Filtering):
标记化后,标记会进一步被过滤器(filters)处理。
过滤器执行各种转换和操作,如转换为小写、去除停用词(stop words),词干提取(stemming),同义词扩展等。
倒排索引(Inverted Indexing):
分词处理完成后,Elasticsearch使用倒排索引(inverted index)来存储分词结果。
倒排索引是一种数据结构,通过将标记与其所属文档进行映射,快速确定包含特定标记的文档。
查询匹配:
当执行查询时,查询的文本也会进行分词处理。
Elasticsearch会利用倒排索引来快速查找包含查询标记的文档,并计算相关性得分。
POST /mall-shop_2/_analyze
{
"field": "title",
"text": "总有人会离开"
}
POST /mall-shop_2/_analyze
{
"analyzer": "simple",
"text": "study elasticsearch 8.4.1"
}
POST /mall-shop_2/_analyze
{
"analyzer": "ik_smart",
"text": "总有人会离开"
}
POST /mall-shop_2/_analyze
{
"analyzer": "ik_max_word",
"text": "总有人会离开"
}
本文全方位探讨了Elasticsearch 8.4.1中Mapping的定义及其关键作用,详尽介绍了各类常见字段类型的应用场景与特性,从基础的字符串、数字类型到复杂的地理空间类型,再到特殊用途的如Completion与Percolator类型,为开发者构建高效索引提供了坚实的基础。通过实践案例,展示了如何定义索引的Mapping、插入文档以及执行查询的具体过程,深刻阐述了text与keyword字段类型的选择原则,以及它们在全文搜索与精确匹配中的不同应用场景。
此外,我们还深入分析了Elasticsearch的分词机制,探讨了标准分词器、简易分词器、空白分词器以及强大的IK分词器等,揭示了它们各自的特点与适用场景,并通过实例演示了如何使用不同的分词器对文本进行分析,这对于优化搜索性能和提升查询准确性至关重要。
总之,理解并熟练运用Elasticsearch的Mapping配置与字段类型,以及掌握其强大的分词功能,是提升搜索质量和用户体验的关键。希望本文能成为你深入探索Elasticsearch之旅的有力指南,助你在构建高性能搜索引擎的道路上更进一步。
更多精彩请关注以下公众号
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。