java - Elastic Spring Data 还是 Java 高级 REST 客户端?
问题描述
我是 Elasticsearch 和 Spring 的新手。我编写了一个 Javascript POC,它将 JSON 字符串转换为 Elasticsearch 查询(并执行请求)。它需要一个这样的字符串:
{
"period": "years",
"format": "xml",
"criteria": {
"operator": "OR",
"operands": [
{
"operator": "AND",
"operands": [
{
"operator": "exists",
"field": "def"
},
{
"operator": "includes",
"field": "keywords",
"value": [
"abcd"
]
}
]
},
{
"operator": "AND",
"operands": [
{
"operator": "from",
"field": "links",
"value": 1
},
{
"operator": "includes",
"field": "keywords",
"value": [
"abcd",
"efgh"
]
}
]
}
]
}
}
(注意:此查询可能有任何级别的嵌套)
...并将其转换为:
{
"query": {
"constant_score": {
"filter": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"bool": {
"must": [
{
"exists": {
"field": "def"
}
},
{
"range": {
"effectiveDate": {
"gte": 1543982400,
"lt": 1575518400
}
}
}
]
}
},
{
"bool": {
"must": [
{
"terms": {
"keywords.name": [
"abcd",
"efgh"
]
}
},
{
"range": {
"effectiveDate": {
"gte": 1543982400,
"lt": 1575518400
}
}
}
]
}
}
]
}
},
{
"bool": {
"must": [
{
"bool": {
"must": {
"terms": {
"links": [
11048,
34618,
34658
]
}
}
}
},
{
"bool": {
"must": [
{
"terms": {
"keywords.name": [
"abcd",
"efgh"
]
}
},
{
"range": {
"effectiveDate": {
"gte": 1543982400,
"lt": 1575518400
}
}
}
]
}
}
]
}
}
]
}
}
}
},
"size": 0,
"aggs": {
"by_id": {
"composite": {
"sources": [
{
"agg_on_id": {
"terms": {
"field": "id"
}
}
}
],
"size": 10000,
"after": {
"agg_on_id": -1
}
},
"aggs": {
"latest_snapshot": {
"top_hits": {
"sort": [
{
"effectiveDate": "desc"
}
],
"_source": true,
"size": 1
}
}
}
}
}
}
它首先为第一次访问 Elasticsearch 创建一个查询(类似于上面),以提取构建此查询所需的一些信息(“链接”)。每次访问 Elasticsearch 可能会返回数百万个结果,因此它使用“search_after”机制进行分页。我需要将此 POC 转换为 Spring 应用程序。
问题:哪一个最适合这种情况 - Spring Data Elasticsearch 或 Elasticsearch Java High Level REST Client?Spring data elasticsearch 似乎在创建简单查询方面做得很好,但在这种情况下对我有帮助吗?任何建议都将不胜感激。谢谢!
解决方案
Spring Data Elasticsearch 使用 Elasticsearch 提供的高级客户端进行非反应式实现。
您也可以将 Elasticsearch 中的查询构建器与 Spring Data Elasticsearch 一起使用,这为您提供了最大的灵活性。
Spring Data Elasticsearch 将实体映射(POJO 到 JSON)、存储库函数和来自 Spring Data 的其他东西放在上面。因此,您是否应该选择其中一个不是问题,而是您是否需要或想要使用 Spring Data Elasticsearch 提供的附加功能。
编辑:
使用 Spring Data Elasticsearch 时,您配置使用的RestHighLevelClient
(请参阅文档),然后将其注入您的其他 Spring bean。因此,您甚至可以混合使用 Spring DataElasticsearchOperations
或 Repositories 访问 ES 和RestHighLevelClient
直接使用访问。
推荐阅读
- grid - 为什么 dgrid 不能从 hello world 教程中渲染正确的网格
- javascript - 等待不是等待吗?
- python - 仅使用一次 onscreenclick
- reactjs - jest with typescript 在导入文件时抛出错误
- logging - 哪种最佳集中式日志记录方法适合实施和维护以管理 AWS ECS 上的容器?
- sql-server - 在 SSIS 中连接多个列
- ng2-smart-table - 是否可以在 ng2-smart-table 的列标题中添加工具提示
- python - 如何读取相对较大的 csv 文件?
- git - GitHub 通过 git 在服务器和本地 pc 之间
- javascript - 沃尔玛市场 OAuth API 不断抛出 SYSTEM_ERROR.GMP_GATEWAY_API 错误