
最近在使用ES的时候遇到了这样一个需求。业务初期并不会太考虑到后面业务会对某个字段进行特殊的查询处理操作,因此业务初期ES索引结构往往以满足基础需要为主。而随着业务的发展,现在需要对ES中一些字段做分词处理,为了提高查询的准确性。那么本文描述的问题就是在这样的背景下发生的,为了给ES索引字段增加分词,那么就需要重新创建ES 索引,而重新创建 ES 索引,则一定会需要迁移原始 ES 索引到指定索引后,再迁移回新创建的 ES索引的这么一个操作过程。
为了给 convContent.content 加上 分词插件 hanlp,那么就需要先创建一个和原始 ES 索引字段一致的临时索引,并且需要把原始索引的数据 通过数据迁移的方式迁移到新的临时索引,于是创建了以下mapping 索引

临时索引创建完成之后,就需要把原始索引中的数据导入到新建索引中,执行如下命令
POST _reindex
{
"source": {
"index": "crm_meiqia_conversation",
"size":500
},
"dest": {
"index": "crm_meiqia_conversation_tmp"
}
}在执行原始索引数据迁移到临时索引的过程中出现了这样的错误信息:【startOffset must be non-negative, and endOffset must be >= startOffset, and offsets must not go backwards startOffset=615,endOffset=617,lastStartOffset=616 for field 'convContent.content'】错误信息报错如图所示

基于此报错信息,也查阅了相关资料,更改索引 content 分词器之前没有问题,更改之后就出问题了,那么推测应该是 hanlp分词器引起的问题。
为了解决这个问题,将对应 id "6305338060" 中的数据查询出来,然后逐个对 convContent.content 进行分析,下面执行命令查询 id "6305338060" 的数据
GET crm_meiqia_conversation/_search
{
"query": {
"bool": {
"must": [
{
"term" : {
"_id" : "6305338060"
}
}
]
}
}
}查询结果如图所示,可以看到这里的字段 content 主要记录的是对话信息,那么就需要逐个分析具体是哪个 content 对话信息导致了分词报错

依次执行分词分析语句来分析具体的 content 字段内容信息,执行如下命令
POST /_analyze
{
"analyzer": "hanlp",
"text": """<p>您好,欢迎您咨询,网课全新升级,,<span style="color:#d35400"><strong>主打极速高效,小班精细化管理,现在购买可享补基础服务哦......</strong></span><br/></p><p><strong><span style="color:#8e44ad">限时福利:老学员可享最高优惠购买</span></strong></p><p></p><p>具体规则可直接联系客服发送 <strong><span style="color:#003ba5">【手机号+套餐名称】</span></strong> 查看哦,同时我们也会给您分配专属的学习规划师带领您操作哦!!!</p>"""
}执行分词分析之后的结果也都是正常的,比如这样

那么问题就来了,单独将 报错id 中对应 content 字段的内容拆解出来进行 hanlp 分词工具的分词测试,都是没有问题的,但是在迁移数据时,却是因为这个 content 字段导致的迁移数据分词报错。再经过了多方尝试之后,还是没能找到具体原因,尝试切换为 ES 的默认分词器就可以,考虑到当前字段并不是一定需要 hanlp 分词器,而是采用默认分词器也可以解决业务问题,时间关系,就将这个问题暂且搁置,待以后有时间再继续排查具体 hanlp 分词插件的原因或者是其他原因......
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。