在弹性搜索实现中,我在几个字段的基础上进行了很少的简单聚合,如下所示 -
"aggs" : {
"author" : {
"terms" : { "field" : "author"
, "size": 20,
"order" : { "_term" : "asc" }
}
},
"title" : {
"terms" : { "field" : "title"
, "size": 20
}
},
"contentType" : {
"terms" : { "field" : "docType"
, "size": 20
}
}
}
聚合工作正常,我得到相应的结果。但返回的标题关键字段(或任何其他字段 - 多字),具有单字汇总和结果。我需要返回结果中的完整标题,而不是一个单词 - 这没有多大意义。我怎么能得到它。
当前结果(只是一个片段) -
"title": {
"buckets": [
{
"key": "test",
"doc_count": 1716
},
{
"key": "pptx",
"doc_count": 1247
},
{
"key": "and",
"doc_count": 661
},
{
"key": "for",
"doc_count": 489
},
{
"key": "mobile",
"doc_count": 487
},
{
"key": "docx",
"doc_count": 486
},
{
"key": "pdf",
"doc_count": 450
},
{
"key": "2012",
"doc_count": 397
} ] }
预期结果 -
"title": {
"buckets": [
{
"key": "test document for stack overflow ",
"doc_count": 1716
},
{
"key": "this is a pptx",
"doc_count": 1247
},
{
"key": "its another document and so on",
"doc_count": 661
},
{
"key": "for",
"doc_count": 489
},
{
"key": "mobile",
"doc_count": 487
},
{
"key": "docx",
"doc_count": 486
},
{
"key": "pdf",
"doc_count": 450
},
{
"key": "2012",
"doc_count": 397
} }
我经历了很多文档,它解释了聚合结果的不同方法,但是我无法找到如果获得全文的结果,如果键中的字段结果,请告知我该如何实现?
答案 0 :(得分:28)
您需要在索引中使用未标注的术语副本,在地图使用中使用multi-fields:
{
"test": {
"mappings": {
"book": {
"properties": {
"author": {
"type": "string",
"fields": {
"untouched": {
"type": "string",
"index": "not_analyzed"
}
}
},
"title": {
"type": "string",
"fields": {
"untouched": {
"type": "string",
"index": "not_analyzed"
}
}
},
"docType": {
"type": "string",
"fields": {
"untouched": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}
}
在您的聚合查询中引用未加密的字段:
"aggs" : {
"author" : {
"terms" : {
"field" : "author.untouched",
"size": 20,
"order" : { "_term" : "asc" }
}
},
"title" : {
"terms" : {
"field" : "title.untouched",
"size": 20
}
},
"contentType" : {
"terms" : {
"field" : "docType.untouched",
"size": 20
}
}
}
答案 1 :(得分:0)
似乎已弃用上述帖子中指定的multi_fields http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/_multi_fields.html#_multi_fields
答案 2 :(得分:0)
我遇到了类似的问题。 当我运行命令时:
curl -XGET "localhost:9200/logstash*/_mapping?pretty"
响应中有以下内容,这很有用:
"host" : {
"type" : "string",
"norms" : {
"enabled" : false
},
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},...
我意识到,添加.raw应该更改输出并获得所需的输出。
如下所示:
"aggs": {
"computes": {
"terms": {
"field": "host.raw",
"size": 0
}
}
}
我的诀窍。
对弹性搜索的新手,但我看到许多字符串字段有一个“原始”字段,可以在查询中使用。
如果有专家能够阐明我的发现,那将是件好事。正确/部分正确/错误?!