0

我正在构建一个 Java 应用程序,用于搜索来自 Elasticsearch 的数据(数据来自 kafka 到 logstash,然后是 json 格式的 elasticsearch)。当我使用时,QueryBuilders.queryStringQuery(reqId)我得到所有结果都没有问题,但是当我使用时,QueryBuilders.termQuery("routingRequestID", reqId);即使 reqId 存在于 ES 数据中,我也得到 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":[]}}

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

4

4 回答 4

0

由于您没有为您的搜索词提供索引、示例文档和预期文档的映射。我根据任何信息猜测,routingRequestID您使用的查询类型和查询类型的问题。

看起来routingRequestID定义为text,它standard默认使用分析器,当您使用查询字符串 query时,Elasticsearch 应用了与索引时间相同的分析器,如下面的同一链接中所述:

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

但是,当您按照术语查询文档termQuery中的说明使用时,它不会被分析并使用在查询中传递的相同文本:

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

解决方案:

如果您希望从两个查询中获得相同的结果,请尝试使用匹配查询作为其分析查询。

于 2020-04-04T03:07:04.160 回答
0

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

//This queryBuilders like SQL: select * from XXX where routingRequestID=2421 limit 0,1000
{"from":0,"size":1000,"query":{"term":{"routingRequestID":{"value":"2421","boost":1.0}}}}
于 2020-04-04T03:19:18.567 回答
0

您的文档没有字段routingRequestId。它有一个message包含字段的字段routingRequestId

所以要构建的查询应该是:

{
  "query": {
    "match": {
      "message.routingRequestId": "2421"
    }
  }
}
于 2020-04-04T05:45:04.327 回答
0

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

input {
   kafka {
      bootstrap_servers => "kafka ip"
      topics => ["your kafka topics"]
   }
}
filter {
      json {
        source => "message"
      }
      mutate {
         remove_field => ["message"]
      }
    }

顺便说一句,我正在使用 elasticsearch 7.4、最新的 logstash 和最新的 kafka v。祝你好运,感谢所有试图提供帮助的人!我很感激!这是 elasticsearch logstash 插件的链接,它将指导您完成不同的选项: https ://www.elastic.co/guide/en/logstash/current/plugins-filters-json.html

于 2020-04-07T01:53:51.367 回答