我在我的应用程序中使用了 elasticsearch 和 spring。对于每种索引类型,我都有一个文档映射。使用@Document
注释我已经指定了索引的indexName
和type
。例如:@Document(indexName = "myproject", type = "user")
. 但是对于编写单元测试,我想创建具有不同 indexName 的索引。因此,我希望从属性文件中读取 indexName。春天如何做到这一点?
问问题
1179 次
2 回答
0
您只需使用 SPeL 即可解决此问题。它允许您设置 Spring 将在编译时解析的表达式。因此允许在编译期间处理注释。
@Document(collection = "#{@environment.getProperty('index.access-log')}")
public class AccessLog{
...
}
在 Spring 5.x 之前:
请注意,@
SPeL 中没有。
@Document(collection = "#{environment.getProperty('index.access-log')}")
public class AccessLog{
...
}
此外,我发现 Spring 还支持更简单的表达式@Document(collection = "${index.access-log}")
,但我的结果好坏参半。
如上所述设置注释后,您可以使用
application.properties
index.access-log=index_access
或者application.yaml
index :
access : index_access
于 2021-06-03T18:17:46.940 回答
-2
只需使用单元测试中的 ElasticSearchTemplate 来创建具有不同名称的索引,然后使用方法“index”或“bulkIndex”将文档索引到您刚刚创建的新索引中。
esTemplate.createIndex(newIndexName, loadfromFromFile(settingsFileName));
esTemplate.putMapping(newIndexName, "user", loadfromFromFile(userMappingFileName));
List<IndexQuery> indexes = users.parallelStream().map(user -> {
IndexQuery index = new IndexQuery();
index.setIndexName(newIndexName);
index.setType("user");
index.setObject(user);
index.setId(String.valueOf(user.getId()));
return index;
}).collect(Collectors.toList());
esTemplate.bulkIndex(indexes);
//Load file from src/java/resources or /src/test/resources
public String loadfromFromFile(String fileName) throws IllegalStateException {
StringBuilder buffer = new StringBuilder(2048);
try {
InputStream is = getClass().getResourceAsStream(fileName);
LineNumberReader reader = new LineNumberReader(new InputStreamReader(is));
while (reader.ready()) {
buffer.append(reader.readLine());
buffer.append(' ');
}
} catch (Exception e) {
throw new IllegalStateException("couldn't load file " + fileName, e);
}
return buffer.toString();
}
这应该对我有用。同样的场景。
于 2015-11-24T20:18:33.627 回答