使用自定义分析器索引文档时超时

时间:2016-12-09 18:07:36

标签: c# elasticsearch nest

我正在创建一个我将在项目中使用的索引的映射。 鉴于功能的领域,我希望通过不区分大小写的术语查询来搜索大多数字段。 我曾经使用过自定义分析器(就像这里建议的那样:Elasticsearch Map case insensitive to not_analyzed documents)但是当我尝试索引文档时,进程会挂起60秒,直到发生超时并且整个过程失败。 当我在Sense上测试时,我看到了相同的行为。

这是索引定义:

put /emails
{
   "mappings": {
      "email": {
         "properties": {
            "createdOn": {
               "type": "date",
               "store": true,
               "format": "strict_date_optional_time||epoch_millis"
            },
            "data": {
               "type": "object",
               "dynamic": "true"
            },
            "from": {
               "type": "string",
               "store": true
            },
            "id": {
               "type": "string",
               "store": true
            },
            "sentOn": {
               "type": "date",
               "store": true,
               "format": "strict_date_optional_time||epoch_millis"
            },
            "sesId": {
               "type": "string",
               "store": true
            },
            "subject": {
               "type": "string",
               "store": true,
               "analyzer": "standard"
            },
            "templates": {
               "properties": {
                  "html": {
                     "type": "string",
                     "store": true
                  },
                  "plainText": {
                     "type": "string",
                     "store": true
                  }
               }
            },
            "to": {
               "type": "string",
               "store": true
            },
            "type": {
               "type": "string",
               "store": true
            }
         }
      },
      "event": {
         "_parent": {
            "type": "email"
         },
         "properties": {
            "id": {
               "type": "string",
               "store": true
            },
            "origin": {
               "type": "string",
               "store": true
            },
            "time": {
               "type": "date",
               "store": true,
               "format": "strict_date_optional_time||epoch_millis"
            },
            "type": {
               "type": "string",
               "store": true
            },
            "userAgent": {
               "type": "string",
               "store": true
            }
         }
      }
   },
   "settings": {
      "number_of_shards": "5",
      "number_of_replicas": "0",
      "analysis": {
         "analyzer": {
            "default": {
               "tokenizer": "keyword",
               "filter": [
                  "lowercase"
               ],
               "type": "custom"
            }
         }
      }
   }
}

正如您所看到的,我将分析器定义为“默认”(如果我尝试使用其他名称并将其定义为两种类型的默认分析器,则会出现"Root mapping definition has unsupported parameters: [analyzer : my_analyzer]"错误。)< / p>

这是我尝试将文档添加到索引

post /emails/email/1
{
    "from": "email-address-1",
    "to": "email-address-2",
    "subject": "Hello world",
    "data":{
        "status": "SENT"
    }
}

我真的不明白为什么会发生这种超时。 我还尝试通过C#控制台应用程序使用NEST。同样的行为。

感谢。

PS:用于测试我正在使用由AWS托管的Elasticsearch 2.3和托管在本地docker容器中的Elasticsearch 2.3。

1 个答案:

答案 0 :(得分:1)

问题是您有1个节点和1个主分片和5个副本分片的索引。

由于主节点的副本不会在与主节点相同的节点上分配,因此5个副本都将被取消分配。索引文档时这是一个问题;默认情况下,索引操作的写入一致性为quorum,法定数量为6(1个主要+5个副本)为4(n/2 + 1)。这意味着文档需要写入同一分片的主副本和3个副本才能成功。使用未分配的分片,它无法满足此要求。您将在日志中看到UnavailableShardsException,并显示错误消息。

将索引更改为5个分片和1个副本将解决问题。