当前位置: 首页 > 知识库问答 >
问题:

弹性搜索转换和插入 lat lon 作为批量geo_point

都建树
2023-03-14

我有一个简单的<code>csv<code>文件,它有4个字段,serial_num、post_code、lat、lon,例如:

serial_num,post_code,LAT,LON
06AA209365,PE10 2AZ,532342,168459
98A819621,PE10 1AA,532342,168459
07FD490906,PE12 1VV,497882,157983

我需要批量插入到< code>elasticsearch中。lat lon字段需要在单个geo_point字段中定义,因此我创建了如下映射:

>

  • 索引为串行数据
  • 类型为widget

    PUT /serial_data
    {
    "mappings": {
    "widget": {
      "properties": {
        "serial_number": {
          "type": "string"
        },
        "post_code": {
          "type": "string"
        },
        "location": {
          "type": "geo_point"
        }
      }
    }
    

    }}

    我试图使用embulk来插入数据,因为我认为我有一个定义的映射。如果我将lat定义为双精度或long,那么embulk将解析lat,长到单个位置,它不会,我过于乐观。

    我还认为< code>embulk有一个批量输入json插件,但是我找不到它。

    问题

    关于如何批量加载这些数据的任何想法都将非常感激。

  • 共有1个答案

    樊腾
    2023-03-14

    我使用tree filte插件。

    • embulk过滤器插入:插入位置列
    • embulk-filter-ruby_proc:组合LAT和LON列
    • embulk过滤柱:移除LAT和LON柱

    数据.csv

    serial_num,post_code,LAT,LON
    06AA209365,PE10 2AZ,532342,168459
    98A819621,PE10 1AA,532342,168459
    07FD490906,PE12 1VV,497882,157983
    

    conf.yml

    in:
      type: file
      path_prefix: data.csv
      parser:
        charset: UTF-8
        newline: CRLF
        type: csv
        delimiter: ','
        quote: '"'
        escape: '"'
        trim_if_not_quoted: false
        skip_header_lines: 1
        allow_extra_columns: false
        allow_optional_columns: false
        columns:
        - {name: serial_num, type: string}
        - {name: post_code, type: string}
        - {name: lat, type: long}
        - {name: lon, type: long}
    filters:
      - type: insert
        column: 
          location: 
      - type: ruby_proc
        requires:
          - json
        columns:
          - name: location
            proc: |
              ->(_,record) do 
                return { lat: record["lat"], lon: record["lon"] }.to_json.to_s
              end
            skip_nil: false
    
      - type: column
        columns:
          - {name: serial_num}
          - {name: post_code}
          - {name: location}
    
    
    out: {type: stdout}
    

    输出

    +-------------------+------------------+-----------------------------+
    | serial_num:string | post_code:string |             location:string |
    +-------------------+------------------+-----------------------------+
    |        06AA209365 |         PE10 2AZ | {"lat":532342,"lon":168459} |
    |         98A819621 |         PE10 1AA | {"lat":532342,"lon":168459} |
    |        07FD490906 |         PE12 1VV | {"lat":497882,"lon":157983} |
    +-------------------+------------------+-----------------------------+
    
     类似资料:
    • 我有一个使用spring数据elasticsearch库的项目。我的系统返回了结果,但我想知道如何以域POJO类的形式获得结果。 我没有看到太多关于如何实现这一点的文档,但我不知道应该在谷歌上搜索什么正确的问题。 目前,我的代码是这样的,在我的测试中,它检索正确的结果,但不是作为POJO。 非常感谢您的帮助。

    • 我正在尝试在多个集群(而不是节点)中插入记录。我正在使用spring-data-elastic search(版本2.0.4.version)。我尝试使用不同bean名称在配置中创建2个elasticsearchoperation实例。我正在尝试使用带有索引(IndexQuery IndexQuery)方法的对象进行插入。但当我尝试插入时,我无法保持字段的映射(非分析字段类型)。可以有人请帮助我如

    • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。

    • 我使用的是springboot 2.2.6、Elastic Search 5.6.13,我决定升级到springboot 2.4.1、Elastic Search 7.10。我在ES中存储复杂的文档,以枚举作为值和映射键。对于枚举和字符串(加上自定义序列化器)之间的所有序列化,我使用的是自定义实体映射器和自定义配置的jackson ObjectMapper。 在ES4中,Elasticsearch

    • 当我执行ps-aef grep elasticsearch HeapDumpOnOutOfMemoryError时看到了这一点 501 373 47 1 0 2:29pm ttys004 0:04.14/usr/bin/Java-xms4g-xmx4g-xss256k-djava.awt.headless=true-xx:+useparnewgc-xx:+useparnewgc-xx:+usepa

    • 我从ElasticSearch得到以下错误。 我在Ubuntu上运行Elasticsearch 1.7.2。 我做错了什么?