2017-02-14 26 views
0

В упругом поиске я нужен все документы, в которых иденты являются результатом выполнения другой elasticsearch запроса, как этогоподзапросов в ElasticSearch

{ 
"size": 200, 
"query": { 
    "bool": { 
     "must": { 
      "match": { 
       "targetId": { 
        "query": 1234 
       } 
      } 
     } 
    } 
}, 
"_source": { 
    "includes": [ 
     "userId" 
    ], 
    "excludes": [] 
} 
} 

Если выполнены в SQL будет иметь запрос, похожий на тот, внизу.


select * from mytable where userId in (select userId from mytable where targetId = 1234); 

Но I'am не в состоянии сформировать подобный запрос elasticsearch, есть другие способ реализации вложенных запросов в elasticsearch.

Для разработки этой проблемы, я добавил данные ниже

"hits": [ 
    { 
     "_index": "idx0", 
     "_type": "1234", 
     "_id": "1235-1486716882293", 
     "_source": { 
      "targetid": "42644", 
      "userid": "15784334830333693", 
     } 
    }, 
    { 
     "_index": "idx0", 
     "_type": "1234", 
     "_id": "1235-1486716882293", 
     "_source": { 
      "data": { 
       "info":"user data available" 
      }, 
      "userid": "15784334830333693", 
     } 
    }, 
    { 
     "_index": "idx0", 
     "_type": "1234", 
     "_id": "1235-1486716882293", 
     "_source": { 
      "data": { 
       "info":"user data available" 
      }, 
      "userid": "00000034830333693", 
     } 
    } 
    ] 

Как вы можете видеть из приведенных выше данных, документ пользователя имеет данные, которые содержат только идентификатор пользователя, а также информацию о пользователе, которые достигли целей хранится в другом документе, который имеет targetid и userid.

Чтобы узнать пользователь, достигли целей, я должен выполнить два запрос 1.Get UserIds ES с помощью targetid, что у меня есть, 2.Get всех документов, которые имеют идентификатор пользователя от предыдущего запроса.

Есть ли другой способ сделать это в одном запросе.

+0

Вы можете уйти с помощью [механизма поиска условий] (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html#query-dsl-terms -Погляди) – Val

ответ

1

Внутренние соединения в ES не допускаются. Исходя из мира РСУБД, с этим трудно относиться, но отношения - это компромисс для скорости.

ES имеет различные способы обработки отношений, которые подробно обсуждаются here.