分享 ElasticSearch 导入数据的一个坑,肯定不止我一人中招

xiaoronglv · 发布于 2014年9月02日 · 最后由 xiaohuxu 回复于 2016年7月27日 · 26086 次阅读
1638

今天使用 ES 时,碰到一个坑,估计其他同学或许也会碰到,特此分享一下。

step 1 Model

  1. BetOrder 是一个订单的 model,搜索时我打算使用 term query。我把 mapping 设置为 index: 'not_analyzer' ,故意不分词,以便精确搜索。
  2. Gem 用的是 elasticsearch-rails
# model/bet_order.rb


# Set up index configuration and mapping
# Searching tokens exactly
settings do
  mappings do
    indexes :title,        index: 'not_analyzed'
    indexes :nickname,     index: 'not_analyzed'
    indexes :user_key,     index: 'not_analyzed'
    indexes :out_trade_no, index: 'not_analyzed'
    indexes :trade_no,     index: 'not_analyzed'
    indexes :buyer_email,  index: 'not_analyzed'
  end
end

step 2 导入数据

BetOrder.import

step3 悲剧了,导入数据后 mapping 不对

然后是debug 呀,debug。。。。。

翻来覆去的找,没找到原因,最后去翻了翻 elasticsearch-rails 的源码,原来导入数据的时候需要加上参数 force: true,才会根据 mapping 创建索引。

BetOrder.import force:true

源码地址:

https://github.com/elasticsearch/elasticsearch-rails/blob/fb8bfd91f6f5f9c1473dd920738456bb1114bcdc/elasticsearch-model/lib/elasticsearch/model/importing.rb#L98

问题解决,上一个正常 mapping

顺便请教一个问题:为什么第一次 import 数据时,作者不根据 model 中定义的 mapping 创建。这算不算一个bug?

共收到 8 条回复
122

昨天也遇到这个问题, 这应该算是文档没写清楚吧 , 我学得按照model定义创建 mapping。另外,想请教下有没有用中文分词,用的哪个?谢谢

2511

可以先BetOrder.elasticsearch.create_index!来创建索引,这个时候会按照map来配置。然后可以index各个document。 直接导入没有具体测试,确定import前没有建立index mapping哦。 model里面我是直接用 mapping do end 没用 settings do mappings do end end 不知具体什么区别?

1638

#2楼 @as181920

我测过了,直接 import 时创建的 mapping 是错误的。

1638

#1楼 @lidashuang

中文分词我用的 mmseg_analyzer,效果还不错。

2511

分词以前一直用mmseg,从sphinx到es。不过最近代码里面产品只需要sql like的程度就够,还没有去配置分词。

12357

这个问题之前我也遇到过,还是得读源码。另外使用ik进行处理性能不高,会出现HTTP timeout。后来换成mmseg了。

2511

@xiaoronglv 问下,mapping时比如标签列表tags: [''abc','def']去存储, 当index not_analyzed时候,可以用filter查询查找到 当默认string analyzed时候,可以query match来,这个时候用filter搜索不到 如何让他可以filter又可以在搜索时候被match到,是怎么mapping的

3679

我也被坑了,3q

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册