多个类型和不同字段的{Elasticsearch类似连接查询

时间:2017-12-05 13:08:02

标签: elasticsearch

我有一个名为my_index的Elasticsearch索引,其中包含两种类型的文档:Type1Type2

  • 这两种文档类型包含有关同一类型实体的不同数据。
  • 这两种文档类型都包含相关实体的ID。

我一直在尝试构建类似连接的查询,它会返回符合两种文档类型条件的实体,但我无法使其工作,我也无法找到Elasticsearch多类型或查询文档中的任何引用都表明它是不可能的。

我试图解决的问题是通过获取所有Type1匹配和所有Type2命中并在Elasticsearch之外进行连接来避免手动连接两个结果集,因为索引有数百万个文档< /强>

SQL中的等价物是

select * from 
  Type1 inner join Type2 
    on Type2.EntityId = Type1.EntityId
where 
  Type1.Field = Condition AND
  Type2.Field = Condition [...]

我用来查询的网址是http://elastic/my_index/Type1,Type2/_search,以包含这两种文档类型。

如果我对此网址执行空白查询,我会收到Type1和Type2的点击。

如果我为Type1添加一个标准,它会按预期工作:

{ "query": {
  "bool": {
    "must": [{
      "term": {
        "FieldOnType1": "lorem" } } ] } } }

不知何故,Elasticsearch可以推断出FieldOnType1确实是Type1上的一个字段。

当我为Type2添加标准时,我没有获得任何点击:

{ "query": {
  "bool": {
    "must": [{
      "term": {
        "FieldOnType1": "lorem" } }, {
      "term": {
        "FieldOnType2": "ipsum" } } ] } } }

实际上,有时会有超过2个术语查询,或范围查询和术语查询。

我猜测上述查询的问题是没有一个文档可以同时匹配这两个条件。

我已经尝试了

  • 使用should代替must,我已尝试
  • 使用类型名称限定字段名称,我已尝试
  • 查询的许多变体(包括使用过滤器而不是查询)

但是一切都给了我0次点击。

此处的类似问题建议使用Elasticsearch多搜索API而不是搜索API,但这不会解决我的手动加入问题。问题

有没有办法精心制作&#34; OR&#34;查询将允许两种类型的查询?或其他什么?

1 个答案:

答案 0 :(得分:0)

尝试multi_match query(我使用ES 6,所以索引p /类型):

GET index1,index2/_search
{
  "query":{
    "multi_match": {
      "query": "1",
      "fields": ["FieldOnType1", "FieldOnType2"]
    }
  }
}

如果您需要使用不同的字段, 应该有效:

GET test,test1/_search
{
   "query":{
     "bool": {
       "should": [
         {
           "term": {"firstName": "john"}
         },
         {
           "term": {"firstName1": "jerry1"}
         }
      ]
    }
   }
 }