使用弹性搜索Java API为其他三个索引创建用于搜索目的的新索引

时间:2018-09-04 20:44:20

标签: elasticsearch elasticsearch-5 elasticsearch-java-api

我们需要在多个索引上搜索数据。我们试图通过休眠搜索将它们合并为一个,虽然运行良好,但是一旦实际数据库表更新,此复合索引就不会更新。虽然单个索引已成功更新。因此,尽管我们将策略从休眠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"
        }
      }
    }
  }
}

请通过一些有效的策略来实现这一目标。

我们希望再次搜索这三个索引的所有字段,并检索关联的数据以进行搜索。主键将是所有这三个索引下可用的cltseqnum。

2 个答案:

答案 0 :(得分:0)

如果要同时查询3个索引,您将得到index alias

如果您将Elasticsearch视为关系数据库,则可以尝试去规范化是正确的,因为Elasticsearch不是RDBMS。因此,您可以使用logstash索引和更新/更新文档,以便将所有合并的数据归为一个索引

答案 1 :(得分:0)

通过@IndexedEmbedded@ContainedIn注释并在我们的OneToMany文件下创建了.hbm关系,实现了这一目的。

此外,我们的数据库不是那么相关,否则在使用这些注释之后就不那么容易了。我必须采取一些变通办法来使插入逻辑适用于组合索引(来自三个不同表的单个索引。)。尽管此逻辑确实对插入部分有一些限制/问题,但希望HibernateSearch团队一定会掩盖这些注释将在下一个发行版中更简短地显示。