es查看索引mapping,es index mapping

  es查看索引mapping,es index mapping

  

目录

映射关系结构映射器三种解析方法的实现部分字段摘要

 

  00-1010 Lucene索引的特点之一是归档,索引与字段结合。这个特性为索引和搜索提供了极大的灵活性。Elasticsearch离Lucene更近了一步,可以没有方案。实现这个功能的秘诀就是映射。映射是对索引的每个字段的预置,包括标引和分词方法,是否存储等。根据字段名称,数据可以在映射中找到相应的配置并建立索引。这里将简单分析映射的实现结构,映射的放置、更新和应用将在下面的索引fenx中说明。

  这只是映射中的一部分内容。Mapping扩展了lucene的filed,定义了更多的字段类型,包括Lucene拥有的string、number等字段以及date、IP、byte、geo等相关字段,这也是es的强项。如上图所示,可以分为两类,mapper和documentmapper。前者是所有映射器的父接口。DocumentMapper是映射器的集合,它表示索引的映射器定义。

  00-1010第一种类型是核心字段结构file mapper-Abstract Field mapper-String字段,表示一类数据类型,比如String类型,int类型。

  第二种是Mapper-object Mapper-rootobjmapper,是一种对象类型映射器。这也是elasticsearch对lucene的一大改进,它不希望lucene支持基本数据类型。

  最后一个是Mapper-Root Mapper-IndexFieldMapper,只存在于Root Mapper中,比如图上的IdFieldMapper和indexfield Mapper。它们类似于索引的元数据,只能存在于索引中。

  

Mapping的实现关系结构

Mapper中最重要的方法之一是parse(ParseContext上下文),Mapper的子类都有自己的这个方法的实现。它的主要功能是通过解析ParseContext获得相应的字段。这种方法主要用于索引。索引延续到parseContext中,每个字段解析parsecontext来构建相应的lucene字段。它在AbstractFieldMapper中的实现如下:

 

  公共void parse(ParseContext上下文)引发IOException { final ListltFieldgt。fields=new ArrayListltgt;(2);try { parseCreateField(context,fields);//实际的字段解析方法为(fieldfield3360fields) {if(!custom boost()){////Set boost field . setboost(boost);} if (context.listener()。beforefielddated(this,field,context)) { context.doc()。添加(字段);//将解析后的字段添加到上下文中} } } catch(exception e){ throw new mapper解析异常(未能解析[names.fullname ()],e);} multiFields.parse(this,context);//分析多字段。多字段的作用是对同一个字段进行不同的定义,比如用不同的分词方法进行索引,方便查询if (copyTo!=null){ copy to . parse(context);}} parseCreateField这里是一个抽象方法,每种数据类型都有自己的实现,比如string。

  的实现方式如下所示:

  

protected void parseCreateField(ParseContext context, List<Field> fields) throws IOException { ValueAndBoost valueAndBoost = parseCreateFieldForString(context, nullValue, boost);//解析成值和boost if (valueAndBoost.value() == null) { return; } if (ignoreAbove > 0 && valueAndBoost.value().length() > ignoreAbove) { return; } if (context.includeInAll(includeInAll, this)) { context.allEntries().addText(names.fullName(), valueAndBoost.value(), valueAndBoost.boost()); } if (fieldType.indexed() fieldType.stored()) {//构建LuceneField Field field = new Field(names.indexName(), valueAndBoost.value(), fieldType); field.setBoost(valueAndBoost.boost()); fields.add(field); } if (hasDocValues()) { fields.add(new SortedSetDocValuesField(names.indexName(), new BytesRef(valueAndBoost.value()))); } if (fields.isEmpty()) { context.ignoredValue(names.indexName(), valueAndBoost.value()); } }//解析出字段的值和boost public static ValueAndBoost parseCreateFieldForString(ParseContext context, String nullValue, float defaultBoost) throws IOException { if (context.externalValueSet()) { return new ValueAndBoost((String) context.externalValue(), defaultBoost); } XContentParser parser = context.parser(); if (parser.currentToken() == XContentParser.Token.VALUE_NULL) { return new ValueAndBoost(nullValue, defaultBoost); } if (parser.currentToken() == XContentParser.Token.START_OBJECT) { XContentParser.Token token; String currentFieldName = null; String value = nullValue; float boost = defaultBoost; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); } else { if ("value".equals(currentFieldName) "_value".equals(currentFieldName)) { value = parser.textOrNull(); } else if ("boost".equals(currentFieldName) "_boost".equals(currentFieldName)) { boost = parser.floatValue(); } else { throw new ElasticsearchIllegalArgumentException("unknown property [" + currentFieldName + "]"); } } } return new ValueAndBoost(value, boost); } return new ValueAndBoost(parser.textOrNull(), defaultBoost); }

以上就是Mapper如何将一个值解析成对应的Field的过程,这里只是简单介绍,后面会有详细分析。

 

  

 

  

部分Field

DocumentMapper是一个索引所有Mapper的集合,它表述了一个索引所有field的定义,可以说是lucene的Document的定义,同时它还包含以下index的默认值,如index和search时默认分词器。它的部分Field如下所示:

 

  

private final DocumentMapperParser docMapperParser; private volatile ImmutableMap<String, Object> meta; private volatile CompressedString mappingSource; private final RootObjectMapper rootObjectMapper; private final ImmutableMap<Class<? extends RootMapper>, RootMapper> rootMappers; private final RootMapper[] rootMappersOrdered; private final RootMapper[] rootMappersNotIncludedInObject; private final NamedAnalyzer indexAnalyzer; private final NamedAnalyzer searchAnalyzer; private final NamedAnalyzer searchQuoteAnalyzer;

DocumentMapper的功能也体现在parse方法上,它的作用是解析整条数据。之前在Mapper中看到了Field是如何解析出来的,那其实是在DocumentMapper解析之后。index请求发过来的整条数据在这里被解析出Field,查找Mapping中对应的Field设置,交给它去解析。如果没有且运行动态添加,es则会根据值自动创建一个Field同时更新Mapping。方法代码如下所示:

 

  

public ParsedDocument parse(SourceToParse source, @Nullable ParseListener listener) throws MapperParsingException { ParseContext.InternalParseContext context = cache.get(); if (source.type() != null && !source.type().equals(this.type)) { throw new MapperParsingException("Type mismatch, provide type [" + source.type() + "] but mapper is of type [" + this.type + "]"); } source.type(this.type); XContentParser parser = source.parser(); try { if (parser == null) { parser = XContentHelper.createParser(source.source()); } if (sourceTransforms != null) { parser = transform(parser); } context.reset(parser, new ParseContext.Document(), source, listener); // will result in START_OBJECT int countDownTokens = 0; XContentParser.Token token = parser.nextToken(); if (token != XContentParser.Token.START_OBJECT) { throw new MapperParsingException("Malformed content, must start with an object"); } boolean emptyDoc = false; token = parser.nextToken(); if (token == XContentParser.Token.END_OBJECT) { // empty doc, we can handle it... emptyDoc = true; } else if (token != XContentParser.Token.FIELD_NAME) { throw new MapperParsingException("Malformed content, after first object, either the type field or the actual properties should exist"); } // first field is the same as the type, this might be because the // type is provided, and the object exists within it or because // there is a valid field that by chance is named as the type. // Because of this, by default wrapping a document in a type is // disabled, but can be enabled by setting // index.mapping.allow_type_wrapper to true if (type.equals(parser.currentName()) && indexSettings.getAsBoolean(ALLOW_TYPE_WRAPPER, false)) { parser.nextToken(); countDownTokens++; } for (RootMapper rootMapper : rootMappersOrdered) { rootMapper.preParse(context); } if (!emptyDoc) { rootObjectMapper.parse(context); } for (int i = 0; i < countDownTokens; i++) { parser.nextToken(); } for (RootMapper rootMapper : rootMappersOrdered) { rootMapper.postParse(context); } } catch (Throwable e) { // if its already a mapper parsing exception, no need to wrap it... if (e instanceof MapperParsingException) { throw (MapperParsingException) e; } // Throw a more meaningful message if the document is empty. if (source.source() != null && source.source().length() == 0) { throw new MapperParsingException("failed to parse, document is empty"); } throw new MapperParsingException("failed to parse", e); } finally { // only close the parser when its not provided externally if (source.parser() == null && parser != null) { parser.close(); } } // reverse the order of docs for nested docs support, parent should be last if (context.docs().size() > 1) { Collections.reverse(context.docs()); } // apply doc boost if (context.docBoost() != 1.0f) { Set<String> encounteredFields = Sets.newHashSet(); for (ParseContext.Document doc : context.docs()) { encounteredFields.clear(); for (IndexableField field : doc) { if (field.fieldType().indexed() && !field.fieldType().omitNorms()) { if (!encounteredFields.contains(field.name())) { ((Field) field).setBoost(context.docBoost() * field.boost()); encounteredFields.add(field.name()); } } } } } ParsedDocument doc = new ParsedDocument(context.uid(), context.version(), context.id(), context.type(), source.routing(), source.timestamp(), source.ttl(), context.docs(), context.analyzer(), context.source(), context.mappingsModified()).parent(source.parent()); // reset the context to free up memory context.reset(null, null, null, null); return doc; }

将整条数据解析成ParsedDocument,解析后的数据才能进行后面的Field解析建立索引。

 

  

 

  

总结

以上就是Mapping的结构和相关功能概括,Mapper赋予了elasticsearch索引的更强大功能,使得索引和搜索可以支持更多数据类型,灵活性更高,更多关于elasticsearch索引index Mapping关系结构的资料请关注盛行IT其它相关文章!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • canvas裁剪图片上传,canvas如何上传图片
  • PDF-XChange PROv8.0.335.0绿色破解版一款非常实用的PDF编辑、处理和打印软件合集包
  • win10怎么设置高性能显卡运行,win10笔记本怎么把显卡性能调最高
  • cad三维模型怎么渲染出来,cad三维模型怎么渲染图片
  • 内存分析器 (MAT)(内存分析工具volatility)
  • jdbc连接sql server数据库步骤,简述jdbc提供的连接数据库的几种方法_1
  • win11简体中文语言包,windows11中文语言包下载
  • win10无法连接网络,win10专业版连不上网络
  • java程序如何实现数据的输入和输出,java的数据输入
  • 判断是否是json格式,java判断字符串是否符合格式
  • XYLIO Future DJ Prov1.10中文破解版一款非常专业的DJ混音软件。
  • windows10怎么关闭笔记本电脑触摸板,笔记本win10触摸板无法关闭
  • vue 父组件调用子组件,vue子组件使用父组件方法
  • 给文件夹添加密码,防止重要资料被他人窥视。
  • win7免费升级win10日期,windows7免费升级windows10
  • 留言与评论(共有 条评论)
       
    验证码: