无法在弹性中获得联接查询

时间:2019-09-23 16:41:46

标签: elasticsearch

我有Elasticsearch版本7.3和两个索引profilespurchases, 这是他们的映射:

\purchases
{
    "purchases": {
        "mappings": {
            "properties": {
                "product": {
                    "type": "keyword"
                },
                "profile": {
                    "type": "join",
                    "eager_global_ordinals": true,
                    "relations": {
                        "profiles": "purchases"
                    }
                }
            }
        }
    }
}

\profiles
{
    "profiles": {
        "mappings": {
            "properties": {
                "user": {
                    "type": "keyword"
                }
            }
        }
    }
}

我用user:abc, _id:1添加了一个配置文件,并用这种方式购买了两次

{
    "profile": {"name": "profiles", "parent": "1"},
    "product" : "tomato",
}
{
    "profile": {"name": "profiles", "parent": "1"},
    "product" : "tomato 2",
}

然后我会搜索购买查询

{
    "query": {
    "has_parent": {
      "parent_type": "profiles",
      "query": {
        "query_string": {
          "query": "user:abc"
        }
      }
    }
  }
}

我得到空结果,怎么了?

1 个答案:

答案 0 :(得分:1)

Join datatype文档中所述,您可以不能在多个索引上创建父子关系:

  

join数据类型是一个特殊字段,可在相同索引的文档内创建父/子关系。

如果要使用联接数据类型,则必须在一个索引中对其进行建模。

更新

这是您的映射和文档索引编制的样子:

PUT profiles-purchases-index
{
  "mappings": {
    "properties": {
      "user":{
        "type": "keyword"
      },
      "product":{
        "type": "keyword"
      },
      "profile":{
        "type": "join",
        "relations":{
          "profiles": "purchases"
        }
      }
    }
  }
}

索引父文档:

PUT profiles-purchases-index/_doc/1
{
  "user": "abc",
  "profile": "profiles"
}

索引子文档:

PUT profiles-purchases-index/_doc/2?routing=1
{
  "product": "tomato",
  "profile":{
    "name": "purchases",
    "parent": 1
  }
}

PUT profiles-purchases-index/_doc/3?routing=1
{
  "product": "tomato 2",
  "profile":{
    "name": "purchases",
    "parent": 1
  }
}

运行查询:

GET profiles-purchases-index/_search
{
  "query": {
    "has_parent": {
      "parent_type": "profiles",
      "query": {
        "match": {
          "user": "abc"
        }
      }
    }
  }
}

响应:

{
  ...
    "hits" : [
      {
        "_index" : "profiles-purchases-index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_routing" : "1",
        "_source" : {
          "product" : "tomato",
          "profile" : {
            "name" : "purchases",
            "parent" : 1
          }
        }
      },
      {
        "_index" : "profiles-purchases-index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_routing" : "1",
        "_source" : {
          "product" : "tomato 2",
          "profile" : {
            "name" : "purchases",
            "parent" : 1
          }
        }
      }
    ]
  }
}

请注意,您必须设置路由参数以索引子文档。但是请参阅该文档。