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

xiaoronglv · 2014年09月02日 · 最后由 xiaohuxu 回复于 2016年07月27日 · 49329 次阅读

今天使用 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?

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

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

#2 楼 @as181920

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

#1 楼 @lidashuang

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

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

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

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

我也被坑了,3q

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