Elasticsearch基础之_source字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch基础之_source字段相关的知识,希望对你有一定的参考价值。

参考技术A

该字段是mapping里的一个元数据字段,本意在索引阶段是否保留原文本的字段内容,可以指定截取多个字段的内容。

在type的mapping中配置形式如下:

在索引数据后,获取数据,可以发现返回如下格式数据,重点关注_source字段里面的json为空。

禁用的目的是为了节省空间,如果不是特别需要可以考虑使用压缩的方式。因此强烈建议该配置打开。

正如上文提到的,禁用字段的_source,会引发一系列问题,尤其影响后续的数据迁移(reindex接口)。建议不要禁用该字段,为了实现:

如确实考虑到节省磁盘资源,可以开压缩。需要返回部分字段内容可采用source字段过滤方式。
source过滤
在search时指定_source配置,指定需要过滤的字段,支持正则表达式,很常见的使用方式,并且很方便。
如下面搜索方式即可包含f1,f2开头的字段,并且过滤以f3命名结尾的字段

不足:

elasticsearch可通过doc value fields、stored fields以及script fields等的配置方式来解决以上的不足,这些方式不在本文的讨论范围。

elasticsearch - 返回字段的标记

【中文标题】elasticsearch - 返回字段的标记【英文标题】:elasticsearch - Return the tokens of a field 【发布时间】:2012-10-22 03:03:33 【问题描述】:

如何在结果中返回特定字段的标记

例如,一个 GET 请求

curl -XGET 'http://localhost:9200/twitter/tweet/1'

返回


    "_index" : "twitter",
    "_type" : "tweet",
    "_id" : "1", 
    "_source" : 
        "user" : "kimchy",
        "postDate" : "2009-11-15T14:12:12",
        "message" : "trying out Elastic Search"
     

我希望将“_source.message”字段的标记包含在结果中

【问题讨论】:

【参考方案1】:

还有另一种方法可以使用以下 script_fields 脚本:

curl -H 'Content-Type: application/json' -XPOST 'http://localhost:9200/test-idx/_search?pretty=true' -d '
    "query" : 
        "match_all" :  
    ,
    "script_fields": 
        "terms" : 
            "script": "doc[field].values",
            "params": 
                "field": "message"
            
        

    
'

请务必注意,虽然此脚本返回已编入索引的实际术语,但它还会缓存所有字段值,并且在大索引上可能会使用大量内存。因此,在大型索引上,从存储的字段或源中检索字段值并使用以下 MVEL 脚本即时重新解析它们可能更有用:

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import java.io.StringReader;

// Cache analyzer for further use
cachedAnalyzer=(isdef cachedAnalyzer)?cachedAnalyzer:doc.mapperService().documentMapper(doc._type.value).mappers().indexAnalyzer();

terms=[];
// Get value from Fields Lookup
//val=_fields[field].values;

// Get value from Source Lookup
val=_source[field];

if(val != null) 
  tokenStream=cachedAnalyzer.tokenStream(field, new StringReader(val)); 
  CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute); 
  while(tokenStream.incrementToken())  
    terms.add(termAttribute.toString())
  ; 
  tokenStream.close(); 
 
terms

此 MVEL 脚本可以存储为 config/scripts/analyze.mvel 并与以下查询一起使用:

curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '
    "query" : 
        "match_all" :  
    ,
    "script_fields": 
        "terms" : 
            "script": "analyze",
            "params": 
                "field": "message"
            
        
    
    
'

【讨论】:

这很可怕,但很有趣。 :) 我希望可以在 DocLookup 中访问 IndexReader(它在那里,但目前是私有的)。这样就可以使用术语向量而不是第二次重新分析文本。 是的,当然。不用脚本也可以通过插件阅读术语向量不是很好吗? @imotov 有什么方法可以从此脚本自动获取字段的正确分析器和字段类型?我想在metacpan.org/module/… 中使用这个功能 请添加tokenStream.reset();在while循环之前(否则我的设置会失败)。 我认为如果不在 elasticsearch 5.0 及更高版本中编写插件,这是不可能实现的。【参考方案2】:

如果您指的是已编入索引的令牌,您可以在消息字段上创建 terms facet。增加size 值以获取更多条目,或设置为0 以获取所有术语。

Lucene 提供了存储术语向量的功能,但目前无法通过 elasticsearch 访问它(据我所知)。

你为什么需要它?如果您只想检查索引的内容,可以查看analyze api。

【讨论】:

很好,这就是我要找的。谢谢

以上是关于Elasticsearch基础之_source字段的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch 中 _source 字段

图解elasticsearch的_source_allstore和index

图解Elasticsearch中的_source_allstore和index属性

Elasticsearch es 索引 内置 字段 _source

elasticSearch-mappings(映射,分析)

Elasticsearch 查询怎么返回指定的字段值