使用自定义分析器索引文档时超时
Timeout when indexing document with custom analyzer
我正在为将在项目中使用的索引创建映射。
鉴于功能的领域,我希望大多数字段都可以通过不区分大小写的术语查询进行搜索。
我已经使用了一个自定义分析器(如此处建议的分析器: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"
}
}
}
}
}
如您所见,我将分析器定义为 "default"(如果我尝试使用其他名称并将其定义为两种类型中的每一种的默认分析器,我会得到 "Root mapping definition has unsupported parameters: [analyzer : my_analyzer]"
错误)。
我正在尝试将文档添加到索引
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 个节点和一个包含 1 个主分片和 5 个副本分片的索引。
由于主副本不会分配到与主副本相同的节点上,因此 5 个副本将全部取消分配。这是索引文档时的一个问题;默认情况下,索引操作的写入一致性为 quorum
,6 的法定人数(1 个主副本 + 5 个副本)为 4 (n/2 + 1
)。这意味着文档需要写入同一分片的主副本和 3 个副本才能成功。对于未分配的分片,将无法满足这一要求。您会在日志中看到一个 UnavailableShardsException
,其中包含一条错误消息。
将索引更改为 5 个分片和 1 个副本将解决问题。
我正在为将在项目中使用的索引创建映射。 鉴于功能的领域,我希望大多数字段都可以通过不区分大小写的术语查询进行搜索。 我已经使用了一个自定义分析器(如此处建议的分析器: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"
}
}
}
}
}
如您所见,我将分析器定义为 "default"(如果我尝试使用其他名称并将其定义为两种类型中的每一种的默认分析器,我会得到 "Root mapping definition has unsupported parameters: [analyzer : my_analyzer]"
错误)。
我正在尝试将文档添加到索引
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 个节点和一个包含 1 个主分片和 5 个副本分片的索引。
由于主副本不会分配到与主副本相同的节点上,因此 5 个副本将全部取消分配。这是索引文档时的一个问题;默认情况下,索引操作的写入一致性为 quorum
,6 的法定人数(1 个主副本 + 5 个副本)为 4 (n/2 + 1
)。这意味着文档需要写入同一分片的主副本和 3 个副本才能成功。对于未分配的分片,将无法满足这一要求。您会在日志中看到一个 UnavailableShardsException
,其中包含一条错误消息。
将索引更改为 5 个分片和 1 个副本将解决问题。