我的ES索引格式为
{
"adminfile" : {
"mappings" : {
"properties" : {
"text" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
其中“ title”字段是在“ text”字段中找到的字符串的标题。标题不包含任何空格,而文本是普通文本(带有空格和点的句子等)。
我想获取索引中的所有术语及其doc_count和/或频率。我在ES文档中找到了此查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html
GET /adminfile/_search
{
"size": 10,
"aggs" : {
"text" : {
"terms" : {
"field" : "text.keyword",
"order" : { "_count" : "asc" },
"size": 10
}
}
}
}
这将返回所有源,但聚合存储桶为空。如果我在该命令中将“ text.keyword”更改为“ title.keyword”,它将起作用并返回所有标题作为键。
为什么它在文本字段上不起作用?
是否有更好的命令使用?我知道这:
GET /adminfile/_search
{
"query" : {
"match" : {"text" : "WordToSearch"}
},
"_source":false,
"aggregations": {
"keywords" : {
"significant_text" : {
"field" : "text",
"filter_duplicate_text": true,
"size": 100
}
}
},
"highlight": {
"fields": {
"text": {}
}
}
}
可以获取索引的每个文档中wordToSearch的所有出现次数以及计数和频率。有没有办法让此命令匹配每个文档的每个单词?
编辑:我还曾尝试将文本字段的名称更改为“ contenu”,以防ES不喜欢具有名称为“ text”且类型为“ text”的字段。没有效果。
另一种选择可能是使用https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html,但_termvectors仅适用于一个特定的ID(或_mtermvectors适用于多个特定的ID,无论如何都不适用于所有文档)
EDIT2:我意识到ignore_above可能是一个问题。我尝试将所有文字切成200个字符作为测试。查询现在可以运行,只不过它返回整个文本作为键,而不是将其切成单词。
答案 0 :(得分:0)
使用字段的keyword
版本时,内容将作为单个大令牌保留。您以为ignore_above
是问题的根源是正确的,因为这些标记在数据集中显然比256个字符长。
如果您改为跨标记化字段(普通文本字段)而不是keyword
版本进行汇总,则将获得该字段处理的每个单词(即每个标记)的计数。