我们需要在多个索引上搜索数据。我们试图通过休眠搜索或将它们合并为一个,进展顺利,但是一旦实际的数据库表更新,这个复合索引就不会更新。尽管单个索引已成功更新。因此,我们将策略从休眠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"
}
}
}
}
}
百斯CLT0300
{
"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"
}
}
}
}
}
百斯乐0900
{
"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 个索引,则所追求的是索引别名
如果你认为Elasticsearch是关系数据库,那么是的,尝试非规范化是正确的,因为elasticsearch不是RDBMS。因此,您可以使用 logstash 索引和更新/更新插入文档,以便将所有组合数据放入一个索引中
通过@IndexedEmbedded
和@ContainedIn
注释以及在我们的.hbm
文件下创建OneToMany
关系来实现这一点。
此外,我们的数据库不是那么关系,否则使用这些注释后将是小菜一碟。我必须做一些解决方法才能使插入逻辑适用于组合索引(来自三个不同表的单个索引(。尽管此逻辑在插入部分方面确实存在一些限制/问题,但希望HibernateSearch
团队肯定会在下一个版本中更简要地掩盖这些注释。