ES查询不同类型并通过公共字段加入

时间:2017-12-07 13:49:54

标签: elasticsearch

我正在尝试调查这是否是弹性搜索中的可能性,因为我想最好地解耦数据,我希望每个字段内都有indextypes个。

问题1 :这个决定有多糟糕?

现在,如果我输入name

/myindex/name

{
    "name" : "mat",
    "id":1
}

surname

/myindex/surname    
{
    "surname" : "txt",
    "id":1
}

问题2 :如何创建name='mat AND surname='txt'的搜索并返回id

如果我这样运行查询(在索引上,没有指定类型):

/myindex/_search
{

    "query" : {
       "bool" : {
        "should" : [{
            "term" : { "name" : "mat" }
        },
        {
            "term" : { "surname" : "txt" }
        }]
       }
    }
}

它返回(显然)两个文档,我可以说join by id吗?

1 个答案:

答案 0 :(得分:0)

如果你要使用ElasticSearch(或任何其他noSQL数据库),你真的需要改变你的心态"加入"。我们根本没有在noSQL中加入......总之......相反,你应该做的是在每条记录中放置重复的数据。

采用以下示例:假设我有一个产品,并且每个产品都有产品类型。

在SQL中,2条记录如下所示:

| Product ID | Product Name | Product Type ID |
| ---------- | ------------ | --------------- |
| 1 | product name 1 | 99 |
| 2 | product name 2 | 99 |

在elasticsearch中,我们会存储这样的数据:

products/product/1
{
    "name": "product name 1",
    "type: {
        "type name": "product type 99"
    }
}

products/product/2
{
    "name": "product name 2",
    "type: {
        "type name": "product type 99"
    }
}

请注意两行中的产品类型信息是如何重复的。作为一般规则,noSQL具有更快的优势,但代价是数据重复。这意味着更改名称"产品类型99"因为我需要在N条记录中更改它。

希望这有帮助。