我们需要在多个索引上搜索数据。我们试图通过hibernate search orm将它们组合成一个,结果很顺利,但是一旦实际数据库表更新,这个复合索引就不会更新。尽管单个索引更新成功。因此,我们建议将策略从hibernate orm更改为弹性搜索javaapi。
为了实现这一点,我在想如果我能得到任何逻辑,在触发搜索查询之前将三个不同的索引合并为一个。这样我就可以从所有三个索引中获取数据。这些索引确实有一个公共字段,可以被视为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"
}
}
}
}
}
请帮助一些逻辑/策略来实现这一点。
我们再次希望搜索这三个索引的所有字段并检索相关数据以进行搜索。主键将是所有三个索引下可用的cltseqnum。
你追求的是索引别名如果你想同时查询3个索引
如果你认为Elasticsearch是关系数据库,那么尝试去规范化是正确的,因为elasticsearch不是RDBMS的。所以你可以使用logstash索引和更新/更新文档,这样你就可以将所有组合数据放入一个索引中
通过@IndexedEmbedded
和@ContainedIn
注释并在我们的. hbm
文件下创建OneTo多
关系来实现这一点。
此外,我们的数据库不是那么关系型的,否则使用这些注释后就小菜一碟了。我不得不做一些变通方法来使插入逻辑适用于组合索引(来自三个不同表的单个索引。)。尽管这个逻辑确实对插入部分有一些限制/问题,但希望HibernateSearch
团队肯定会在下一个版本中更简短地掩盖这些注释。