目标是通过spring引导应用程序从索引中查询特定字段。
问题在最后。
elasticsearch中的数据是从带有Beats和Logstash等的Elastic Stack中创建的。存在一些不一致性,例如,一些点击中可能缺少一些字段。
spring应用程序不添加数据,也无法控制字段和索引
我需要的查询,用_source
带来
GET index-2022.07.27/_search
{
"from": 0,
"size": 100,
"_source": ["@timestamp","message", "agent.id"],
"query": {
"match_all": {}
}
}
将命中率作为
{
"_index": "index-2022.07.27",
"_id": "C1zzPoIBgxar5OgxR-cs",
"_score": 1,
"_ignored": [
"event.original.keyword"
],
"_source": {
"agent": {
"id": "ddece977-9fbb-4f63-896c-d3cf5708f846"
},
"@timestamp": "2022-07-27T09:18:27.465Z",
"message": """a message"""
}
},
用CCD_ 2代替CCD_ 3是
{
"_index": "index-2022.07.27",
"_id": "C1zzPoIBgxar5OgxR-cs",
"_score": 1,
"_ignored": [
"event.original.keyword"
],
"fields": {
"@timestamp": [
"2022-07-27T09:18:27.465Z"
],
"agent.id": [
"ddece977-9fbb-4f63-896c-d3cf5708f846"
],
"message": [
"""a message"""
]
}
},
- 如何使用Spring Boot获取此查询
我依靠StringQuery
和RestHighLevelClient
,如下所示,但无法使其工作
Query searchQuery = new StringQuery("{"_source":["@timestamp","message","agent.id"],"query":{"match_all":{}}}");
SearchHits<Items> productHits = elasticsearchOperations.search(
searchQuery,
Items.class,
IndexCoordinates.of(CURRENT_INDEX));
- Items.class必须具有什么形式?什么领域
我只需要时间戳、消息、agent.id。后面的是可选的,它可能不存在。
- 映射将如何工作
版本:
- 弹性:8.3.2
- 弹簧套:2.6.6
- 弹性(mvn(:7.15.2
- 弹簧数据弹性搜索(mvn(:4.3.3
官方文档指出,RestHighLevelClient
版本应支持
正在跟踪对即将推出的Elasticsearch版本的支持假设使用高级REST客户端。
您可以为要读取的数据定义一个实体类(注意,我有一个用于代理的嵌套类(:
@Document(indexName = "index-so", createIndex = false)
public class SO {
@Id
private String id;
@Field(name = "@timestamp", type = FieldType.Date, format = DateFormat.date_time)
private Instant timestamp;
@Field(type = FieldType.Object)
private Agent agent;
@Field(type = FieldType.Text)
private String message;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Instant getTimestamp() {
return timestamp;
}
public void setTimestamp(Instant timestamp) {
this.timestamp = timestamp;
}
public Agent getAgent() {
return agent;
}
public void setAgent(Agent agent) {
this.agent = agent;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
class Agent {
@Field(name = "id", type = FieldType.Keyword)
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
}
那么查询将是:
var query = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.withSourceFilter(new FetchSourceFilter(
new String[]{"@timestamp", "message", "agent.id"},
new String[]{}))
.build();
var searchHits = operations.search(query, SO.class);