Нет результатов при поиске строки, разделенной пробелом, с использованием RestHighLevelClient (JAVA Spring-boot)

#java #spring #rest #spring-boot #elasticsearch

#java #весна #rest #spring-boot #elasticsearch

Вопрос:

Я использую RestHighLevelClient для использования эластичных API.

Версия RestHighLevelClient: 6.4.3 Эластичная версия: 6.7

Я получаю правильные результаты при передаче одной строки, но никаких результатов при передаче строк, разделенных пробелом, с использованием RestHighLevelClient. Однако то же самое отлично работает с Postman.

Мой JAVA-код:

 search(broker, "merchant_stores", QueryBuilders.fuzzyQuery("search_string", searchString).fuzziness(Fuzziness.TWO), DeviceMerchantStore.class)
  
 protected Flux<T> search(final String index, final String type, final QueryBuilder queryBuilder, final Class<T> clazz) throws IOException {
        SearchRequest searchRequest = new SearchRequest(index);
        searchRequest.types(type);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);
        final SearchResponse searchResponse = elasticClient.search(searchRequest, RequestOptions.DEFAULT);
        final List<T> l = new ArrayList<>();
        for(SearchHit searchHit: searchResponse.getHits().getHits()) {
            l.add(new ObjectMapper().readValue(searchHit.getSourceAsString(), clazz));
        } return Flux.fromIterable(l);
    }
  

Запрос, построенный на JAVA:

 {
  "fuzzy" : {
    "search_string" : {
      "value" : "croma Maharashtra",
      "fuzziness" : "2",
      "prefix_length" : 0,
      "max_expansions" : 50,
      "transpositions" : false,
      "boost" : 1.0
    }
  }
}
  

Запрос запущен в Postman

 {
  "query": {
    "match": {
      "search_string": {
        "query": "croma Maharashtra",
        "fuzziness": 2,
        "max_expansions" : 50,
        "prefix_length" : 0,
        "boost":1.0
      }
    }
  }
}
  

Дайте мне знать, чего мне здесь не хватает.

Ответ №1:

У вас нет такого же результата из-за «транспозиций»: false. Действительно, при совпадении (допустим, у вас есть std analyzer) похоже, что транспозиции истинны (и вы не можете установить для него значение false). Таким образом, в результате запроса соответствия ab = ba будет возвращено, как в вашем нечетком запросе они не будут.

Ответ №2:

Запросы не совпадают:

Изменить:

 QueryBuilders.fuzzyQuery("search_string", searchString).fuzziness(Fuzziness.TWO)
  

Для:

 QueryBuilders.fuzzyQuery("search_string", searchString).fuzziness(Fuzziness.TWO).transpositions(false)