• 92795

    文章

  • 776

    评论

  • 17

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

ElasticSearch 数据类型创建错误解决方式一

撸了今年阿里、腾讯和美团的面试,我有一个重要发现.......>>

实际的工作中往往会出现es数据类型不正确的请求, es 不支持类型修改, 例如:

"name": {

    "type": "keyword"

}

name 不支持模糊搜索, 想要修改成

"name": {

    "term_vector": "with_positions_offsets",
    "type": "text",
    "fields": {
        "pinyin_full": {
            "analyzer": "full_pinyin_analyzer",
            "term_vector": "with_positions_offsets",
            "type": "text"
        },
        "keyword": {
            "ignore_above": 32,
            "type": "keyword"
        },
        "pinyin_keyword": {
            "analyzer": "keyword_pinyin_analyzer",
            "term_vector": "with_positions_offsets",
            "type": "text"
        },
        "pinyin_sim": {
            "analyzer": "sim_pinyin_analyzer",
            "term_vector": "with_positions_offsets",
            "type": "text"
        }
    }

},

问题来了, 怎么办

 

好在es 提供别名的机制

只能重新创建一个索引V2, mappings 文件修改成正确的类型

这样es 中就存在两个不同版本的索引

 

将v1 版本的数据导入的v2版本, 如何导入方式千万。本人提供一个python 脚本给诸位参考, host 是es的ip

# coding=utf-8
import json
from elasticsearch import Elasticsearch

es = Elasticsearch(hosts=[{'host': 'xxx', 'port': 9200}])

index_input = "hd_goods_v1"
index_output = "hd_goods_v2"
_type = "goods"
size = 10000


def put_one(b):
    try:
        print(json.dumps(b))
        data = b['_source']
        _id = str(b["_id"])
        resp = es.create(index=index_output, id=_id, doc_type=_type, body=data)
        print(json.dumps(resp))
    except BaseException, err:
        print "Exception", err


def do_main():

    body = {"query": {"bool": {"must": [], "must_not": [], "should": []}}, "size": size}
    result = es.search(index=index_input, doc_type=_type, body=body)
    buckets = result['hits']['hits']
    for b in buckets:
        put_one(b)


if __name__ == '__main__':

    do_main()

 

假如你是线上生产环境, 时刻有同步数据, 应该关闭同步,然后再导入数据。 

假如你的数据量比较大, es 又不支持一次查询那么多数据, 那只能把数据全部dump到本地,读取文件的方式导入喽

 

# coding=utf-8
import json

from elasticsearch import Elasticsearch

es = Elasticsearch(hosts=[{'host': 'xxx', 'port': 9200}])

index_output = "hd_goods_v2"
_type = "goods"


def put_one(line):
    try:
        print line
        data = json.loads(line)
        _id = str(data["_id"])
        data["id"] = int(data["_id"])
        del data["_id"]
        print(_id)
        print(json.dumps(data))
        res = es.update(index=index_output, doc_type=_type, id=_id, body={
            'doc_as_upsert': True, 'doc': data})
        print(json.dumps(res))
    except BaseException, err:
        print "Exception", err


def do_main():
    f = open("t_goods.dat", "r")
    line = f.readline()
    while line != "":
        print line
        put_one(line)
        line = f.readline()


if __name__ == '__main__':

    do_main()

不要忘记数据导完之后, 删除原来的别名, 新建v2版本的别名

如果有同步数据源,请打开测试

 

 


695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

欢迎来到梁钟霖个人博客网站。本个人博客网站提供最新的站长新闻,各种互联网资讯。 还提供个人博客模板,最新最全的java教程,java面试题。在此我将尽我最大所能将此个人博客网站做的最好! 谢谢大家,愿大家一起进步!

转载原创文章请注明出处,转载至: 梁钟霖个人博客www.liangzl.com

1条评论

Loading...


发表评论

电子邮件地址不会被公开。 必填项已用*标注

自定义皮肤
注册梁钟霖个人博客