【问题标题】:elasticsearch data increase & duplicate at each restart每次重启时elasticsearch数据都会增加和重复
【发布时间】:2014-10-03 07:30:52
【问题描述】:

我在 Windows 7 上使用带有 angularjs 和 oracle 的 elasticsearch。 它工作得越来越好(感谢stackoverflower的帮助)。我对弹性搜索有疑问:我的文档中的元素数量正在增加,我不知道为什么/如何。 我的由 elasticsearch 索引的 oracle 表包含 12010 个元素,现在我在弹性文档中获得了 84070 个元素(经常由 curl _count 检查):所以它现在复制了 7 次数据。几天前我重新索引了表格,但我之前删除了 elasticsearch“数据”文件夹。

每次我重新启动 Windows 时,数据似乎都会增加。

感谢您的帮助。

这就是我安装和索引我的数据的方式:


我只是第一次这样做:


创建索引

curl -XPOST 'localhost:9200/donnees'

映射:

curl -XPUT 'localhost:9200/donnees/specimens/_mapping' -d '{
"specimens" : {
    "_all" : {"enabled" : true},
    "_index" : {"enabled" : true},
    "_id" : {"index": "not_analyzed", "store" : false},
    "properties" : {
        "O_OCCURRENCEID"                                : {"type" : "string",   "store" : "no","index": "not_analyzed"  } ,
            .... 
        "I_INSTITUTIONCODE"                             : {"type" : "string",   "store" : "yes","index": "analyzed" } 
    }
}}'

查询oracle和索引数据:

curl -XPUT 'localhost:9200/_river/donnees_s/_meta' -d '{
 "type" : "jdbc",
 "jdbc" : {
    "index" : "donnees",
    "type" : "specimens",
    "url" : "jdbc:oracle:thin:@localhost:1523:recolnat",
     "user" : "user",
     "password" : "password",
     "sql" : "select * from all_specimens_data"
   }
}'

(这是正确的吗??如果我将“curl -XPUT 'localhost:9200/_river/donnees_s/_meta'”替换为“curl -XPUT 'localhost:9200/donnees/specimens/_meta'”,它将不起作用我用来查询)

测试:

curl -XGET 'http://localhost:9200/donnees/specimens/_count?q=*'
    => 12010
curl -XGET 'http://localhost:9200/donnees/specimens/_search?q=P00009359'
    => return data ok

【问题讨论】:

  • 您的选择中不应该有一个“_id”列以正确识别已加载的行吗?
  • “O_OCCURRENCEID”列是我的数据库表中的唯一 ID。你在说映射中的这一行:“_id”:{“index”:“not_analyzed”,“store”:false}?
  • 我的意思是select O_OCCURRENCEID as _id ....blahblah...
  • 不,我没有,但是当我查询弹性搜索时,弹性添加了一个:pastebin.com/zXNay7sX
  • 每次加载数据时都会生成新的_id字段值,所以jdbc River无法确定它已经加载了哪些记录

标签: elasticsearch


【解决方案1】:

感谢 Konstantin V. Salikhov 解决。

elasticsearch 服务每次启动时都会使用提供给 _river 的 sql 查询数据库并获取数据(参见我之前的“查询 oracle 和索引数据:”)。如果数据没有“_id”列,_river 无法确定它已经加载了哪些记录,并且每次都重复数据。 为了避免重复,我在数据库中编辑了我的“all_specimens_data”表(实际上是一个避免修改数据库的视图)并将“O_OCCURRENCEID”重命名为“_id”,“O_OCCURRENCEID”是我的主键 UUID。

希望这对其他人有所帮助

【讨论】:

  • 换句话说,不是使用select * from [my_sql_table] 创建索引,而是将其创建为select [sql_pk] as '_id', * from [my_sql_table]。当然,您不应该这样做select *,除非您真的有意这样做。重要的是不要让 elasticsearch 生成新的 PK。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
相关资源
最近更新 更多