使用弹性搜索从其他三个索引创建用于搜索目的的新索引 java api

Creating a new index for search purpose fom three other indexes with elastic search java api

我们需要在多个索引上搜索数据。我们试图通过 hibernate search orm 将它们合并为一个,它进行得很顺利,但是一旦实际数据库 table 更新,这个复合索引就不会更新。虽然个别索引已成功更新。因此,我们虽然将策略从 hibernate orm 更改为 elastic search java api.

为了实现这一点,我在考虑是否可以在触发搜索查询之前获得任何逻辑将三个不同的索引合并为一个。这样我就可以从所有三个索引中获取数据。这些索引确实有一个公共字段,可以将其视为 id 字段。我可以在这个 id 字段上关联这些并从这些索引中检索关系数据,post 将它们合并为一个。

下面是我要合并的三个索引的索引定义。

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/strategy 实现这一目标。

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

你要的是index alias如果你想同时查询3个索引

如果您将 Elasticsearch 视为关系数据库,那么是的,尝试非规范化是正确的,因为 elasticsearch 不是 RDBMS。因此,您可以使用 logstash 索引和 update/upsert 文档,这样您就可以将所有组合数据放入一个索引

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

还有,我们的数据库不是那么关联的,不然用了这些注解就小菜一碟了。我不得不做一些变通办法使插入逻辑适用于组合索引(来自三个不同表的单个索引。)。虽然这个逻辑确实有一些 restrictions/issues 与插入部分,希望 HibernateSearch 团队肯定会在下一版本中更简要地掩盖这些注释。