我一直在尝试使用facet来获取字段的频率。我的查询仅返回一次匹配,因此我想让方面返回在特定字段中出现频率最高的字词。
我的映射:
{
"mappings":{
"document":{
"properties":{
"tags":{
"type":"object",
"properties":{
"title":{
"fields":{
"partial":{
"search_analyzer":"main",
"index_analyzer":"partial",
"type":"string",
"index" : "analyzed"
}
"title":{
"type":"string",
"analyzer":"main",
"index" : "analyzed"
}
},
"type":"multi_field"
}
}
}
}
}
},
"settings":{
"analysis":{
"filter":{
"name_ngrams":{
"side":"front",
"max_gram":50,
"min_gram":2,
"type":"edgeNGram"
}
},
"analyzer":{
"main":{
"filter": ["standard", "lowercase", "asciifolding"],
"type": "custom",
"tokenizer": "standard"
},
"partial":{
"filter":["standard","lowercase","asciifolding","name_ngrams"],
"type": "custom",
"tokenizer": "standard"
}
}
}
}
}
测试数据:
curl -XPUT localhost:9200/testindex/document -d '{"tags": {"title": "people also kill people"}}'
查询:
curl -XGET 'localhost:9200/testindex/document/_search?pretty=1' -d '
{
"query":
{
"term": { "tags.title": "people" }
},
"facets": {
"popular_tags": { "terms": {"field": "tags.title"}}
}
}'
这个结果
"hits" : {
"total" : 1,
"max_score" : 0.99381393,
"hits" : [ {
"_index" : "testindex",
"_type" : "document",
"_id" : "uI5k0wggR9KAvG9o7S7L2g",
"_score" : 0.99381393, "_source" : {"tags": {"title": "people also kill people"}}
} ]
},
"facets" : {
"popular_tags" : {
"_type" : "terms",
"missing" : 0,
"total" : 3,
"other" : 0,
"terms" : [ {
"term" : "people",
"count" : 1 // I expect this to be 2
}, {
"term" : "kill",
"count" : 1
}, {
"term" : "also",
"count" : 1
} ]
}
}
以上结果不是我想要的。我想让频率计数为2
"hits" : {
"total" : 1,
"max_score" : 0.99381393,
"hits" : [ {
"_index" : "testindex",
"_type" : "document",
"_id" : "uI5k0wggR9KAvG9o7S7L2g",
"_score" : 0.99381393, "_source" : {"tags": {"title": "people also kill people"}}
} ]
},
"facets" : {
"popular_tags" : {
"_type" : "terms",
"missing" : 0,
"total" : 3,
"other" : 0,
"terms" : [ {
"term" : "people",
"count" : 2
}, {
"term" : "kill",
"count" : 1
}, {
"term" : "also",
"count" : 1
} ]
}
}
我该如何实现?方面走错了路吗?
构面会计算文档,而不是文档中的术语。您得到1是因为只有一个文档包含该术语,所以发生多少次都没有关系。我不知道使用开箱即用的方式来返回术语频率,该方面不是一个好的选择。
如果启用术语向量,则该信息可以存储在索引中,但是目前尚无法从elasticsearch读取术语向量。
这个问题不是如何通过多个字段进行聚合,我们可以使用子聚合。 如果你知道SQL,我可以给你一个完美的解释: 我们能在Elasticsearch中实现这一点吗? 谢谢。
问题内容: 如何在结果中返回特定字段的标记 例如,一个GET请求 退货 我想在结果中包含“ _source.message”字段的标记 问题答案: 使用以下script_fields脚本还有另一种方法: 重要的是要注意,尽管此脚本返回已被索引的实际术语,但它也会缓存所有字段值,并且在大索引上会占用大量内存。因此,在较大的索引上,使用以下MVEL脚本从存储的字段或源中检索字段值并快速重新解析它们可能
问题内容: 我正在使用Elasticsearch索引我的文档。 是否有可能指示它仅返回特定字段,而不是它存储的整个json文档? 问题答案: 是的 使用源过滤器。如果您使用JSON搜索,它将看起来像这样: 在ES 2.4及更低版本中,您还可以在search API中 使用fields选项: ES 5+中已弃用此功能。而且,源过滤器更强大!
问题内容: 在elasticsearch的实现中,基于几个字段,我只有几个简单的聚合,如下所示: 聚合工作正常,我得到了相应的结果。但是返回的标题键字段(或任何其他字段-多字)具有单个字的汇总和结果。我需要返回结果中的完整标题,而不是一个单词- 没什么意义。我该怎么办。 当前结果(仅是摘录)- 预期成绩 - 我浏览了很多文档,它解释了汇总结果的不同方法,但是如果结果中的字段中有字段,我找不到如何获
问题内容: 为什么在能够过滤查询时无法看到_timestamp字段? 以下查询返回正确的文档,但不会返回时间戳本身。如何返回时间戳? 映射为: 样本输出: 问题答案: 启用时间戳字段后,默认情况下会对其进行索引但不存储。因此,尽管您可以通过时间戳字段进行搜索和过滤,但是您无法轻松地通过记录来检索它。为了能够检索时间戳字段,您需要使用以下映射重新创建索引: 这样,您将能够检索到时间戳记以来的毫秒数。
我有以下POJO 在下面的类中,我想直接检索给定人员的嵌套字段“cars”,其名称作为参数传递,但它返回一个具有null值的列表。 但是,如果在上面的searchHits代码中,我将类更改为Person,如下所示,我将返回pojo Person,其中只填写属性“cars”(所有其他属性检索为null): 但是如何直接检索嵌套的属性车?