API-интерфейс Spring Data (содержащий или начинающийся с) не работает с SPACE, который имеет подстановочный знак

Я использую Elastic Search с данными Spring.

У меня есть простой метод в репозитории:

findByUserNameContaining("a b");

Этот метод не дает ожидаемого результата из-за ПРОБЕЛА.

Ошибка получения:

"Невозможно построить запрос '"a b"'. Вместо этого используйте выражение или несколько предложений." EXCEPTION="org.springframework.dao.InvalidDataAccessApiUsageException: невозможно построить запрос '"a b"'. Вместо этого используйте выражение или несколько предложений.

За прекращение создания нескольких токенов из-за пробела. У меня есть отображение:

"userName": {
    "type": "string",
    "index": "not_analyzed"
},

Я совершенно удивлен, что я получаю эту проблему после "index": "not_analyzed" в отображении.

Помогите мне, пожалуйста. Заранее спасибо!


person Vijay    schedule 03.04.2017    source источник
comment
Привет, когда вы делаете свое поле не проанализированным, вы фактически сохраняете необработанное поле в elasticsearch, как вы, вероятно, знаете. Эта ошибка, которую вы получаете, возникает еще до того, как ваш запрос был отправлен в elasticsearch, это проверка весенних данных, применяемая для методов запроса с подстановочными знаками, как вы можете видеть по адресу: github.com/spring-projects/spring-data- эластичный поиск/blob/   -  person groo    schedule 03.04.2017
comment
Привет, спасибо за ваш ответ, мы можем избежать этого исключения? Мне нужно использовать содержащий метод со строкой, имеющей пробел.   -  person Vijay    schedule 04.04.2017
comment
Вероятно, вы ищете запрос на соответствие фразе, который будет делать то, что вам нужно: elastic.co/guide/en/elasticsearch/reference/current/ Но, насколько мне известно, это недоступно из коробки в spring-data-elasticsearch, поэтому вам необходимо реализовать пользовательский метод: docs.spring .io/spring-data/elasticsearch/docs/current/reference/, где у вас есть доступ к эластичному API Java и вы можете реализовать то, что вам нужно. Если вы опубликуете немного больше информации о своем сопоставлении и мне понадобится, я смогу ответить с кодом   -  person groo    schedule 04.04.2017
comment
Большое спасибо !   -  person Vijay    schedule 05.04.2017


Ответы (4)


На самом деле API-интерфейс данных Spring (содержащий или startWith) не работает с пробелом в String . Я реализовал то же самое с Elastic core API.

NativeSearchQueryBuilder aNativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        aNativeSearchQueryBuilder.withIndices(indexName).withTypes(type);
        final BoolQueryBuilder aQuery = new BoolQueryBuilder();

            aQuery.must(QueryBuilders.queryStringQuery("a b").defaultField("UserName"));

NativeSearchQuery nativeSearchQuery = aNativeSearchQueryBuilder.withQuery(aQuery).build();
        List<Object> aDatas = elasticsearchTemplate.queryForList(nativeSearchQuery, Object.class);
person Vijay    schedule 10.04.2017
comment
Когда я использую это и ищу b, результатов не появляется. Только когда я ищу a или a b, появляются результаты. Похоже, запрос работает для совпадения префикса. - person Shubham A.; 02.06.2017

Вы должны замаскировать пробелы:

findByUserNameContaining("a\\ b");
person Ant    schedule 12.10.2017

В моем случае мне просто нужно было закодировать строку в URL-адресе, поэтому при поиске b просто закодируйте ее, чтобы она стала% 20b, после чего будет построен запрос.

Я использую последнюю версию Springboot 2.3.*

person mark ortiz    schedule 22.01.2021

Это можно реализовать с помощью метода expression в Criteria API.

с кавычками вокруг текста поиска для точного соответствия

criteria.and(new Criteria("FieldName").expression("\"" + SEARCH_TEXT_WITH_SPACE + "\""));

с звездочкой вокруг текста поиска для совпадения подстановочного знака

criteria.and(new Criteria("FieldName").expression("*" + SEARCH_TEXT_WITH_SPACE + "*"));
person Ravi Kant Asthana    schedule 16.02.2021