我正在构建一个Java应用程序,该应用程序搜索Elasticsearch中的数据(数据从kafka到logstash,然后是json格式的elasticsearch)。当我使用QueryBuilders.queryStringQuery(reqId)
时,我没问题就得到了所有结果,但是当我使用QueryBuilders.termQuery("routingRequestID", reqId);
时,即使ES数据中存在reqId,我的命中也为0。
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
@GetMapping("/q/{reqId}")
public String searchByReqId(@PathVariable("reqId") final String reqId) throws IOException {
String[] indexes = {"devglan-log-test"};
QueryBuilder queryBuilder = QueryBuilders.termQuery("routingRequestID", reqId);
// QueryBuilder queryBuilder = QueryBuilders.queryStringQuery(reqId);
SearchSourceBuilder searchSource = SearchSourceBuilder.searchSource().query(queryBuilder).from(0).size(1000);
System.out.println(searchSource.query());
SearchRequest searchRequest = new SearchRequest(indexes, searchSource);
System.out.println(searchRequest.source().toString());
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(searchResponse.toString());
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
System.out.println(hit.toString());
}
return "success";
}
{
took: 633,
timed_out: false,
_shards: {
total: 1,
successful: 1,
skipped: 0,
failed: 0
},
hits: {
total: {
value: 1,
relation: "eq"
},
max_score: 1.6739764,
hits: [
{
_index: "devglan-log-test",
_type: "_doc",
_id: "k4qAPXEBCzyTR4XVXPb2",
_score: 1.6739764,
_source: {
@version: "1",
message: "
{"requestorRole":"role3", "requestorGivenName":"doe", "requestorSurName":"male",
"requestorOrganizationName":"dob", "reqd":"address",
"requestorC":"city", "routingRequestID":"7778787898778879"}",
@timestamp: "2020-04-03T00:45:53.917Z"
}
}
]
}
}
[searchSource.query()
生成的查询:
{
"term" : {
"routingRequestID" : {
"value" : "2421",
"boost" : 1.0
}
}
}
在searchRequest.source().toString()
中生成的查询:
{"from":0,"size":1000,"query":{"term":{"routingRequestID":{"value":"2421","boost":1.0}}}}
结果:
{"took":0,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":0,"relation":"eq"},"max_score":null,"hits":[]}}
非常感谢所有帮助,如果您知道如何帮助,请不要跳过该帖子。 *高个表情符号*
由于您尚未提供搜索词的索引,样本文档和预期文档的映射。我想根据任何信息,是您的routingRequestID
和您使用的查询类型的问题。
看起来像routingRequestID
被定义为text
,默认情况下使用standard
分析器,当您使用query string query时,Elasticsearch应用了使用索引时间的同一分析器,如以下同一链接中所述:
然后查询在返回之前独立分析每个拆分文本匹配文件。
但是,当您按照termQuery
中的说明使用term query doc时,不会对其进行分析,而是使用相同的文本,该文本在查询中传递:
返回在提供的字段中包含确切术语的文档。
如果要从两个查询中获得与分析后的结果相同的结果,请尝试使用match query。>
我认为您应该检查数据routingRequestID = 2421
是否存在。
您的文档没有字段routingRequestId
。它具有字段message
,其中包含字段routingRequestId
。
所以问题是所有信息都在一个字段中。我通过更改logstash配置并使用matchQuery解决了该问题。如果您使用的是kafka和json格式,则需要在logstash配置文件中添加以下内容: