Elasticsearch возвращает ноль хитов при использовании termQuery в QueryBuilders - PullRequest
0 голосов
/ 04 апреля 2020

Я создаю приложение Java, которое ищет данные из Elasticsearch (данные поступают из kafka в logsta sh, а затем в эластичный поиск в формате json). Когда я использую QueryBuilders.queryStringQuery(reqId), я получаю все результаты обратно без проблем, но когда я использую QueryBuilders.termQuery("routingRequestID", reqId);, я получаю 0 совпадений, даже если reqId присутствует в данных ES.


    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":[]}}

Вся помощь действительно приветствуется, и, пожалуйста, не пропустите пост, если вы знаете, как помочь. * Highfive Emoji *

Ответы [ 4 ]

0 голосов
/ 07 апреля 2020

Таким образом, проблема была в том, что вся информация была в одном поле. Я решил проблему, изменив конфигурации logsta sh, а затем воспользовавшись matchQuery. Вот что вам нужно добавить в ваш конфигурационный файл logsta sh, если вы используете kafka и формат json:

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

, если я используюasticsearch 7.4, последний logsta sh и последняя Кафка v. Удачи и спасибо всем, кто пытался помочь! Я ценю это! Вот ссылка на плагинasticsearch logsta sh, который проведет вас через различные варианты: https://www.elastic.co/guide/en/logstash/current/plugins-filters-json.html

0 голосов
/ 04 апреля 2020

Я думаю, вы должны проверить данные 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}}}}
0 голосов
/ 04 апреля 2020

В вашем документе нет поля routingRequestId. У него есть поле message, которое содержит поле routingRequestId.

Итак, запрос для сборки должен быть:

{
  "query": {
    "match": {
      "message.routingRequestId": "2421"
    }
  }
}
0 голосов
/ 04 апреля 2020

Поскольку вы не предоставили сопоставление своего индекса, образцов документов и ожидаемых документов для вашего условия поиска. Я полагаю, исходя из любой информации, - это проблема с вашим routingRequestID и типом запроса, который вы используете.

Похоже, routingRequestID определяется как text, который использует анализатор standard по умолчанию, и когда вы используете запрос строки , Elasticsearch применил тот же анализатор, который использовал индексное время, как указано ниже в той же ссылке:

Затем запрос анализирует каждый разделенный текст независимо перед возвратом соответствующих документов.

Но когда вы используете termQuery, как описано в term query, выполните c, это не так. анализируется и использует тот же текст, который передается в запросе:

Возвращает документы, содержащие точный термин в указанном поле.

Решение:

Попробуйте использовать запрос на совпадение , если вы хотите, чтобы в обоих запросах был одинаковый результат, как и в проанализированном запросе.

...