当前位置: 首页 > 面试题库 >

elasticsearch-返回字段的标记

阴高刚
2023-03-14
问题内容

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

例如,一个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”字段的标记


问题答案:

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

curl '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"
            }
        }

    }
}'


 类似资料:
  • 问题内容: 我正在使用Elasticsearch索引我的文档。 是否有可能指示它仅返回特定字段,而不是它存储的整个json文档? 问题答案: 是的 使用源过滤器。如果您使用JSON搜索,它将看起来像这样: 在ES 2.4及更低版本中,您还可以在search API中 使用fields选项: ES 5+中已弃用此功能。而且,源过滤器更强大!

  • 这个问题不是如何通过多个字段进行聚合,我们可以使用子聚合。 如果你知道SQL,我可以给你一个完美的解释: 我们能在Elasticsearch中实现这一点吗? 谢谢。

  • 问题内容: 我一直在尝试使用facet来获取字段的频率。我的查询仅返回一次匹配,因此我想让方面返回在特定字段中出现频率最高的字词。 我的映射: 测试数据: 查询: 这个结果 } 以上结果不是我想要的。我想让频率计数为2 我该如何实现?方面走错了路吗? 问题答案: 构面会计算文档,而不是文档中的术语。您得到1是因为只有一个文档包含该术语,所以发生多少次都没有关系。我不知道使用开箱即用的方式来返回术语

  • 问题内容: 为什么在能够过滤查询时无法看到_timestamp字段? 以下查询返回正确的文档,但不会返回时间戳本身。如何返回时间戳? 映射为: 样本输出: 问题答案: 启用时间戳字段后,默认情况下会对其进行索引但不存储。因此,尽管您可以通过时间戳字段进行搜索和过滤,但是您无法轻松地通过记录来检索它。为了能够检索时间戳字段,您需要使用以下映射重新创建索引: 这样,您将能够检索到时间戳记以来的毫秒数。

  • 我正在使用ElasticSearch 7.3来查询一些文档, 我想在查询响应中只返回每个文档的特定字段, 我发现可以使用来实现这一点, 我可以从Kibana使用这个查询来实现这一点- 返回给我正确的数据- 但我无法使用ElasticSearch的节点客户端实现同样的功能- 有人能帮我找到正确的方法来实现我的用例吗? 引用- https://www.elastic.co/guide/en/elast

  • 有没有办法告诉elasticsearch不返回任何元数据?目前,我可以选择哪些字段我想返回在源代码中。但我只想要源码中的字段。我宁愿不返回元数据,因为我不需要它,并节省一些不必要的解析和传输等。 我找到了弹性搜索--如何只返回数据,而不返回元信息?旧的问题,有人评论说当时不可能做到这一点。想知道这个功能是已经添加了还是仍然缺少?