[Elasticsearch在QueryBuilders中使用termQuery时返回零命中

问题描述 投票:0回答:4

我正在构建一个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":[]}}

非常感谢所有帮助,如果您知道如何帮助,请不要跳过该帖子。 *高个表情符号*

elasticsearch elastic-stack spring-data-elasticsearch elasticsearch-7
4个回答
0
投票

由于您尚未提供搜索词的索引,样本文档和预期文档的映射。我想根据任何信息,是您的routingRequestID和您使用的查询类型的问题。

看起来像routingRequestID被定义为text,默认情况下使用standard分析器,当您使用query string query时,Elasticsearch应用了使用索引时间的同一分析器,如以下同一链接中所述:

然后查询在返回之前独立分析每个拆分文本匹配文件。

但是,当您按照termQuery中的说明使用term query doc时,不会对其进行分析,而是使用相同的文本,该文本在查询中传递:

返回在提供的字段中包含确切术语的文档。

解决方案:

如果要从两个查询中获得与分析后的结果相同的结果,请尝试使用match query。>


0
投票

我认为您应该检查数据routingRequestID = 2421是否存在。


0
投票

您的文档没有字段routingRequestId。它具有字段message,其中包含字段routingRequestId


0
投票

所以问题是所有信息都在一个字段中。我通过更改logstash配置并使用matchQuery解决了该问题。如果您使用的是kafka和json格式,则需要在logstash配置文件中添加以下内容:

© www.soinside.com 2019 - 2024. All rights reserved.