基于字段值在多个文档中显示元素的Elasticsearch DSL查询

基于字段值在多个文档中显示元素的Elasticsearch DSL查询,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,假设表中的每一行都是单独的文档,如何在弹性搜索中执行类似于下面的select查询 CREATE TABLE orders ( `orderid` varchar, `status` varchar ); insert into orders values('abc','PENDING'); insert into orders values('abc','SENT'); insert into orders values('xyz','PENDING'); select * from

假设表中的每一行都是单独的文档,如何在弹性搜索中执行类似于下面的select查询

CREATE TABLE orders (
  `orderid` varchar,
  `status` varchar
);

insert into orders values('abc','PENDING');
insert into orders values('abc','SENT');
insert into orders values('xyz','PENDING');

select * from orders where status='PENDING' and orderid not in (select orderid from orders where status='SENT')

从SQL查询中,我了解到您需要所有状态为“待定”的记录。不确定您为什么需要此处的和条件来排除status=“SENT”as status=“pending”的订单,这将获得所需的行

现在,说到弹性查询,假设status字段是一个关键字字段,您可以使用bool查询来获取状态为“pending”的文档 类似这样的事情-

{
 "query": {
   "bool": {
      "must": [
         {
           "term":{
             "status.keyword":"PENDING"
           }
         }
      ]
   }
 }
}
如果您需要查找状态为“挂起”和“已发送”(和“条件”)的所有文档,请在上面的“必须”子句中添加另一个术语查询。 如果状态需要为或ed,则将术语查询放在一个shoul子句中(在bool查询中),并将minimum_shoul_match参数设置为1。 如果您需要给定时间范围内的所有值,请在bool中添加一个过滤器,其中包含时间范围查询。
希望这能有所帮助。

与其更新给定订单id的状态,不如在每次订单id的状态更改时插入新行。我在弹性搜索中插入一个新文档,以便在任何时间点都有快照。这些是我正在从应用程序流式传输到elastic search的日志消息,它将用于分析您需要的查询在elastic中不可能谢谢。如果我在上面的例子中应用这个,我想我将得到两个“待定”记录。但我只需要“xyz”,因为abc的最新状态是“已发送”。好的,现在我了解了您的用例,实际上在SQL查询中,我假设orderId是自动生成的主键,对于所有行都不同,但您要排除的是已经完成的订单(“已发送”)。马上,我能想到的是,你可以使用两个查询,第一个查询返回所有已完成的OrderID列表,然后将它们放在一个must_not子句中,以将它们从挂起的订单列表中排除。这是因为ES不支持类似mysql的子查询。你可以看看这个elasticsearch插件,它在ES上添加了一个SQL层-