2015-06-07 45 views
0

我已经建立了从表中的SQL服务器Elasticsearch返回旧的SQL结果

{ 
    "type":"jdbc", 
    "jdbc": 
    { 
     "driver":"com.microsoft.sqlserver.jdbc.SQLServerDriver", 
     "url":"jdbc:sqlserver://[my_ip];databaseName=mega", 
     "user":"sa","password":"******", 
     "sql":"SELECT [OrderID],[CustomerName],[UserFullName],[Status] FROM [Orders_Table]", 
     "poll":"5s", 
     "index": "mega", 
     "type": "orders_search", 
     "schedule" : "0 0-59 0-23 ? * *" 
    } 
} 

中提取数据的索引的问题是,我收到unrelevant查询结果。

例如:]是应仅作为包含在一次数据库返回的行密钥。

{ 

    "from" : 0, "size" : 5, 
    "query": { 
     "multi_match": { 
      "query": "5220668", 
      "fields": [ "_all" ] 
     } 
    } 
} 

结果:事情是错误的结果。 我期待在数据库中看到只有一个命中。而不是查询检索该行的全寿命周期状态

{ 
    "took": 12, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 4, 
     "max_score": null, 
     "hits": [ 
     { 
      "_index": "mega", 
      "_type": "handledorders_search", 
      "_id": "AU3OlBkh6JN7xIrOkzjm", 
      "_score": null, 
      "_source": { 
       "Status": "NEW", 
       "Date": "2015-06-07T03:00:12.110Z", 
       "UserFullName": "my name", 
       "CustomerName": "cust name", 
       "OrderID": 5220668 
      }, 
      "sort": [ 
       1433646012110 
      ] 
     }, 
     { 
      "_index": "mega", 
      "_type": "handledorders_search", 
      "_id": "AU3Ok0E-6JN7xIrOkvpF", 
      "_score": null, 
      "_source": { 
       "Status": "NEW", 
       "Date": "2015-06-07T03:00:12.110Z", 
       "UserFullName": "my name", 
       "CustomerName": "cust name", 
       "OrderID": 5220668 
      }, 
      "sort": [ 
       1433646012110 
      ] 
     }, 
     { 
      "_index": "mega", 
      "_type": "handledorders_search", 
      "_id": "AU3Ole0-6JN7xIrOk7Yo", 
      "_score": null, 
      "_source": { 
       "Status": "FIX", 
       "Date": "2015-06-07T03:00:12.110Z", 
       "UserFullName": "my name", 
       "CustomerName": "cust name", 
       "OrderID": 5220668 
      }, 
      "sort": [ 
       1433646012110 
      ] 
     }, 
     { 
      "_index": "mega", 
      "_type": "handledorders_search", 
      "_id": "AU3OlQL86JN7xIrOk3eH", 
      "_score": null, 
      "_source": { 
       "Status": "CLOSE", 
       "Date": "2015-06-07T03:00:12.110Z", 
       "UserFullName": "my name", 
       "CustomerName": "cust name", 
       "ExternalOrderID": 5220668 
      }, 
      "sort": [ 
       1433646012110 
      ] 
     } 
     ] 
    } 
} 
+0

不同的状态为同一订单ID保持这种命名法是很重要的 。那有什么问题? –

+0

看来你的订单有两次相同的状态,你确定查询只执行一次吗?在数据中,OrderId也成为最后一条记录中的ExternalOrderId。我会先检查数据并检查查询执行的次数。 –

回答

1

我知道你正在使用的_river插件或类似的东西,并依靠Elasticsearch轮询MSSQL数据。

棘手的部分是,当文档更改时,Elasticsearch不知道它是否需要更新文档或创建一个新文档。你知道这些文件是一样的,但是ES没有。你需要告诉ES,这些文件是相同的。

有两种不同的方法。第一个是告诉ES,一个特定的字段是唯一的标识符。您将需要创建一个类似的映射到

{ 
    "mega" : { 
     "_id" : { 
      "path" : "OrderId" 
     } 
    } 
} 

这种方法已经被废弃了,因为1.5.0

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-id-field.html

另一种可能是最简单的一种,它是对的OrderId映射到_id在SQL初始化中。

更多信息http://blog.pluralsight.com/elasticsearch-and-sql-server

的方式与告诉SQL Server 返回主键字段“ID”为“_id”别名的SELECT语句。这是Elasticsearch用于所有文档的默认键 约定。它选择你的数据时,使 Elasticsearch知道要更新文档,而不是创建一个新的 每一次民意调查