最近项目准备用到elasticsearch, 首先需要搞清楚elasticsearch的一些概念,在网上发现这篇文章不错,以通俗易懂的语言讲明白了mapping的概念。
默认mapping
elasticsearch(以下简称ES)是没有模式(schema)的,当我们执行以下命令:
- curl -XPUT http://localhost:9200/test/item/1 -d '{"name":"zach", "description": "A Pretty cool guy."}'
ES能非常聪明的识别出"name"和"description"字段的类型是string, ES默认会创建以下的mapping。
- mappings: {
- item: {
- properties: {
- description: {
- type: string
- }
- name: {
- type: string
- }
- }
- }
- }
什么是mapping
ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。同样的, 一个number类型的mapping字段只能存储number类型的数据。
同语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。
当你的查询没有返回相应的数据, 你的mapping很有可能有问题。当你拿不准的时候, 直接检查你的mapping。
剖析mapping
一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。
filter的功能很容易理解:一个filter就是一个转换数据的方法, 输入一个字符串,这个方法返回另一个字符串,比如一个将字符串转为小写的方法就是一个filter很好的例子。
一个analyzer由一组顺序排列的filter组成,执行分析的过程就是按顺序一个filter一个filter依次调用, ES存储和索引最后得到的结果。
总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。
默认analyzer
回到我们的例子, ES猜测description字段是string类型,于是默认创建一个string类型的mapping,它使用默认的全局analyzer, 默认的analyzer是标准analyzer, 这个标准analyzer有三个filter:token filter, lowercase filter和stop token filter。
我们可以在做查询的时候键入_analyze关键字查看分析的过程。使用以下指令查看description字段的转换过程:
- curl -X GET "http://localhost:9200/test/_analyze?analyzer=standard&pretty=true" -d "A Pretty cool guy."
- {
- "tokens" : [ {
- "token" : "pretty",
- "start_offset" : 2,
- "end_offset" : 8,
- "type" : "<ALPHANUM>",
- "position" : 2
- }, {
- "token" : "cool",
- "start_offset" : 9,
- "end_offset" : 13,
- "type" : "<ALPHANUM>",
- "position" : 3
- }, {
- "token" : "guy",
- "start_offset" : 14,
- "end_offset" : 17,
- "type" : "<ALPHANUM>",
- "position" : 4
- } ]
可以看到, 我们的description字段的值转换成了[pretty], [cool], [guy], 在转换过程中大写的A, 标点符号都被filter过滤掉了, Pretty也转成了全小写的pretty, 这里比较重要的是, 即使ES存储数据的时候仍然存储的是完整的数据, 但是可以搜索到这条数据的关键字只剩下这三个单词了, 其他的都是抛弃掉了。
看看以单词a来搜索的结果:
- $ curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{
- "query" : {
- "text" : { "description": "a" }
- }
- }'
- {
- "took" : 29,
- "timed_out" : false,
- "_shards" : {
- "total" : 5,
- "successful" : 5,
- "failed" : 0
- },
- "hits" : {
- "total" : 0,
- "max_score" : null,
- "hits" : [ ]
- }
- }
text类型的搜索在查询过程中使用了和之前插入数据相同的分析/过滤系统, 所以我们输入"a",mapping不会有任何返回, 因为单词“a”不会被ES存储和索引。反过来,如果我们使用单词"cool"进行搜索:
- curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{
- "query" : {
- "text" : { "description": "cool" }
- }
- }'
- {
- "took" : 29,
- "timed_out" : false,
- "_shards" : {
- "total" : 5,
- "successful" : 5,
- "failed" : 0
- },
- "hits" : {
- "total" : 1,
- "max_score" : 0.15342641,
- "hits" : [ {
- "_index" : "test",
- "_type" : "item",
- "_id" : "1",
- "_score" : 0.15342641, "_source" : {"name":"zach", "description": "A pretty cool guy"}
- } ]
- }
- }
现在就能得到正确的结果,这是一个公认的简单例子, 但是它描述了ES是如何工作的, 不要把mapping想成是数据类型, 把它想象成是搜索数据的指令集合。如果你不想字符"a"被删除, 你需要修改你的analyzer。
原文: http://euphonious-intuition.com/2012/07/an-introduction-to-mapping-in-elasticsearch/
http://blog.csdn.net/lvhong84/article/details/23936697
相关推荐
而标题中提到的"一款基于Java注解的elasticsearch mapping生成工具",正是针对这一需求,为开发者提供了一种简洁且高效的方式来创建和管理ES的映射。 **Java注解与Elasticsearch Mapping** Java注解是一种元数据,...
arcgis elasticSearch es 矢量数据导入插件 数据建模 mapping indexsetting 字段映射 索引建模支持geoshape、shape,text索引支持keyword/ngram/edgeNgram/ikSmart,快速导入,兼容multipolygon,带洞,多面,使用时...
您可以将工件导入到您的项目中: < dependency> < groupId>com.github.nantianba</ groupId> < artifactId>es-mapping-generator</ artifactId> < version>0.1</ version></ dependency>核心Api IndexMapper和...
`elasticsearch-jieba-plugin`正是将jieba分词库与Elasticsearch进行了深度融合,使得ES在处理中文文本时能展现出卓越的性能。 安装此插件的过程简单明了。首先,下载`elasticsearch-jieba-plugin 8.8.2.zip`压缩包...
这个名为"基于.netcore搜索封装ElasticSearch.zip"的压缩包,显然包含了一个针对.NET Core平台的Elasticsearch客户端库,方便开发者在.NET Core应用中集成和操作Elasticsearch。 Elasticsearch是一个开源的分布式...
SpringBoot整合Elasticsearch是现代Java开发中常见的一项任务,因为SpringBoot的便捷性和Elasticsearch的高效搜索能力,使得这种结合在数据检索、分析和日志存储等领域广泛应用。本项目"springboot-elasticsearch-...
3. 在 Elasticsearch 的配置文件 `elasticsearch.yml` 中,你可以进行各种设置,如节点名称、集群名称、数据路径等。 4. 启动 Elasticsearch 服务,可以通过运行解压后的目录中的 `bin/elasticsearch` 脚本来完成。 ...
(ElasticSearch、ELK、搜索引擎、Lucene),本教程旨在带领大家进入搜索引擎领域,从无到有,深入浅出的讲解了什么是搜索引擎,搜索引擎的作用以及ElasticSearch在实际工作中的作用等,课程从如下几个角度,完成让...
在Elasticsearch中,mapping是定义索引中字段的数据类型和属性的过程,它影响着数据如何被索引和搜索。通过自定义注解,开发者可以在实体类上直接声明字段的mapping,避免了手动编写JSON映射文件的繁琐工作。这使得...
**Elasticsearch(ES)** 是一个开源的全文搜索引擎,基于Lucene构建,设计用于分布式、可扩展的数据存储和搜索。在这个"Elasticsearch Demo"项目中,我们将学习如何将Word文档的内容读取并写入Elasticsearch,以及...
同时,在 ElasticSearch 的配置文件 `elasticsearch.yml` 中添加以下内容来启用 ik 分词器: ```yaml index: analysis: analyzer: ik: alias: [ik_analyzer] type: org.elasticsearch.index.analysis....
3. **配置分词器**:在 Elasticsearch 的 mapping 中指定使用 IK 分词器,例如: ``` "analyzer": "ik_max_word", ``` 4. **自定义词典**:根据需求,可以在 config 目录下修改或添加自定义词典文件。 四、在...
7. **映射(Mapping)**:映射是Elasticsearch中的字段配置,定义了字段的数据类型、分析器等,影响着数据的索引和搜索行为。 8. **搜索性能**:Elasticsearch利用倒排索引技术,提供快速的全文检索。同时,通过...
而 "elasticsearch-head-master" 文件则包含 Head 插件的源代码,你需要编译并将其安装到 Elasticsearch 集群中。安装过程通常包括克隆仓库、编译源码、将生成的 JAR 文件放入 Elasticsearch 的 plugins 目录,然后...
- **节点(Node)**:Elasticsearch中的基本工作单元,存储和处理数据。 - **索引(Index)**:类似于数据库中的表,用于存储具有相似结构的数据。 - **类型(Type)**:在6.x版本后被文档映射(Mapping)取代,用于...
这里我们创建了一个名为`es_mapping.app_enterprise_business_tags_es1222`的外部表,其中包含了与Elasticsearch对应的字段类型。 ```sql CREATE EXTERNAL TABLE `es_mapping.app_enterprise_business_tags_es1222`...
1. **节点(Node)**:Elasticsearch中的基本工作单元,每个节点存储和处理一部分数据。 2. **集群(Cluster)**:由一个或多个节点组成,共享相同的数据并共同参与集群的操作。 3. **索引(Index)**:类似于数据库中的表...
最后,`es`包可能是Elasticsearch相关的操作接口或抽象类,它们定义了与Elasticsearch交互的方法,如添加、更新、删除文档,以及查询等。例如: ```java public interface ElasticsearchRepository { void save...
4. **类型(Type)**:在Elasticsearch 7.x及以后的版本中被弃用,之前的版本中每个索引可以包含多个类型。 5. **分片(Shard)**:为了分散存储和提高查询效率,Elasticsearch将索引分成多个分片。分片可以在不同节点...
这通常在创建索引的mapping中完成,通过设置`analyzer`字段为`ik_max_word`或`ik_smart`来选择不同的分词策略。`ik_max_word`倾向于拆分出更多的词汇,适合用于搜索引擎;而`ik_smart`则较为保守,只拆分常见的词汇...