我们需要在多个索引上搜索数据。我们尝试通过hibernate搜索orm将它们组合成一个,它运行良好但是一旦实际的数据库表更新,这个复合索引就不会更新。虽然单个索引已成功更新。所以,我们虽然将我们的策略从hibernate orm改为弹性搜索java api。
为了达到这个目的,我在想如果我可以获得任何逻辑,在触发搜索查询之前将三个不同的索引合并为一个。这样我就可以从所有三个索引中获取数据。这些索引确实有一个公共字段,可以将其视为id字段。我可以在这个id字段上关联它们并从这些索引中检索关系数据,然后将它们合并为一个。
下面是我想要合并的三个索引的索引定义。
basclt0100:
{
"basclt0100" : {
"aliases" : { },
"mappings" : {
"com.csc.pt.svc.data.to.Basclt0100TO" : {
"dynamic" : "strict",
"properties" : {
"clientname" : {
"type" : "text",
"store" : true,
"analyzer" : "nameAnalyzer"
},
"cltseqnum" : {
"type" : "long",
"store" : true
},
"firstname" : {
"type" : "text",
"store" : true,
"analyzer" : "nameAnalyzer"
},
"id" : {
"type" : "keyword",
"store" : true
},
"longname" : {
"type" : "text",
"store" : true,
"analyzer" : "nameAnalyzer"
},
"midname" : {
"type" : "text",
"store" : true
}
}
}
},
"settings" : {
"index" : {
"number_of_shards" : "5",
"provided_name" : "basclt0100",
"creation_date" : "1536086417001",
"analysis" : {
"analyzer" : {
"nameAnalyzer" : {
"filter" : [
"lowercase"
],
"tokenizer" : "keyword"
}
}
},
"number_of_replicas" : "1",
"uuid" : "YKCtVIaCQjatBeb2g1JfUA",
"version" : {
"created" : "6030299"
}
}
}
}
}
basclt0300
{
"basclt0300" : {
"aliases" : { },
"mappings" : {
"com.csc.pt.svc.data.to.Basclt0300TO" : {
"dynamic" : "strict",
"properties" : {
"addrln1" : {
"type" : "text",
"store" : true,
"analyzer" : "addressAnalyzer"
},
"addrln2" : {
"type" : "text",
"store" : true,
"analyzer" : "addressAnalyzer"
},
"addrln3" : {
"type" : "text",
"store" : true
},
"addrseqnum" : {
"type" : "text",
"store" : true
},
"city" : {
"type" : "text",
"store" : true,
"analyzer" : "addressAnalyzer"
},
"cltseqnum" : {
"type" : "long",
"store" : true
},
"country" : {
"type" : "text",
"store" : true,
"analyzer" : "addressAnalyzer"
},
"id" : {
"type" : "keyword",
"store" : true
},
"state" : {
"type" : "text",
"store" : true
},
"zipcode" : {
"type" : "text",
"store" : true,
"analyzer" : "addressAnalyzer"
}
}
}
},
"settings" : {
"index" : {
"number_of_shards" : "5",
"provided_name" : "basclt0300",
"creation_date" : "1536086426461",
"analysis" : {
"analyzer" : {
"addressAnalyzer" : {
"filter" : [
"standard",
"lowercase",
"asciifolding"
],
"tokenizer" : "standard"
}
}
},
"number_of_replicas" : "1",
"uuid" : "irxvUu2qR3udpgJUE0NoSA",
"version" : {
"created" : "6030299"
}
}
}
}
}
basclt0900
{
"basclt0900" : {
"aliases" : { },
"mappings" : {
"com.csc.pt.svc.data.to.Basclt0900TO" : {
"dynamic" : "strict",
"properties" : {
"cltseqnum" : {
"type" : "long",
"store" : true
},
"email1" : {
"type" : "text",
"store" : true,
"analyzer" : "emailAnalyzer"
},
"email2" : {
"type" : "text",
"store" : true,
"analyzer" : "emailAnalyzer"
},
"id" : {
"type" : "keyword",
"store" : true
}
}
}
},
"settings" : {
"index" : {
"number_of_shards" : "5",
"provided_name" : "basclt0900",
"creation_date" : "1536086423657",
"analysis" : {
"analyzer" : {
"emailAnalyzer" : {
"filter" : [
"lowercase"
],
"tokenizer" : "classic"
}
}
},
"number_of_replicas" : "1",
"uuid" : "dmzw9ZswTwCNVvne-FAt2w",
"version" : {
"created" : "6030299"
}
}
}
}
}
请帮助一些iogic /策略来实现这一目标。
我们再次希望搜索这三个索引的所有字段并检索相关数据以进行搜索。主键是所有三个索引下可用的cltseqnum。
如果你想同时查询3个索引,你所追求的是index alias
如果您将Elasticsearch视为关系数据库,那么尝试非规范化是正确的,因为elasticsearch不是RDBMS。因此,您可以使用logstash索引和更新/ upsert文档,以便将所有组合数据合并到一个索引中