首页 > 解决方案 > 在索引中查找最频繁的术语(错误:400 - 所有分片都失败)

问题描述

我在 Elasticsearch 中索引了超过 2.000.000 个文档(使用 R 中的 Elastic 库),我想知道特定字段中最常用的术语,比如说,该字段称为“X”,包含字符串。但是,聚合函数会抛出错误:Error: 400 - all shards failed

我在 R 中尝试了以下内容(从弹性库手册调整的示例)。

步骤1

我首先使用映射创建了索引(即,在原始索引中,'X' 字段被索引为'关键字'字段而不是文本',我想这可能是问题所在。

    body <- list(test = list(properties = list(
         X = list(type="text"),
         Y = list(type="long")
         )))
    if (!index_exists("example")) index_create("example")
    mapping_create(index = "example", type = "test", body=body)

第2步

接下来我索引了一堆文档

    X <- c("xxx first","xxx second","xxx third","yyy fourth")
    Y <- c("21","22","24","17")
    data <- data.frame(X,Y)

    docs_bulk(x=data,index='example',type = "test")

第 3 步

接下来我创建了聚合查询并在 r 中执行它

    body <-   
  '{
   "size": 0,
   "aggs": {
   "frequent_tags": {
   "terms": {"field": "X"}
   }
   }
   }
   '

    Search(index='example',body=body)

第4步

...我收到错误“错误:400 - 所有碎片都失败”

步骤 5 和 6

接下来我添加了“属性”。到正文(即{“field”:“attribute.X”}),现在执行查询,但没有任何结果。我也试过 {"field": "keyword.X"}),但这也没有给出预期的结果。

预期结果

一个物体说

xxx --> 3 documents
yyy --> 1 document
first --> 1 document
second --> 1 document
fourth --> 1 document

谢谢您的帮助; 如果您需要更多信息,请告诉我。

标签: relasticsearch

解决方案


elastic这里的维护者:在尝试解决 Elasticsearch 方面的问题时,第一件事就是要做connect(errors = "complete")- 当有一个时,它将在 R 控制台中抛出完整的 Elasticsearch 堆栈跟踪。这应该让您确切知道查询中的问题出在哪里。

我按照你上面的例子,用connect(errors = "complete")set,我得到:

Search(index='example',body=body)
Error: 400 - all shards failed
ES stack trace:

  type: illegal_argument_exception
  reason: Fielddata is disabled on text fields by default. Set fielddata=true on
    [X] in order to load fielddata in memory by uninverting the inverted index. 
    Note that this can however use significant memory. Alternatively use a keyword
    field instead.

elastic::ping()$version$number
[1] "6.6.1"

推荐阅读