2016-05-11 5 views
2

У меня есть метод репозитория, который выполняет запрос «начинается с» (префикс) в поле userAccount.userName. Когда я ищу строку без пробела, она возвращает правильные результаты. Но когда я ищу строки с пробелом в нем, он генерирует исключение.Spring data elasticsearch репозиторий «StartingWith» throws InvalidDataAccessApiUsageException при поиске строки с пробелами

Мой репозиторий метод:

public List<EsUser> findByUserAccountUserNameStartingWith(String term); 

Строка поиска: Том Круз

Исключение:

org.springframework.dao.InvalidDataAccessApiUsageException: Может не constructQuery «*» Том Круз"'. Вместо этого используйте выражение или несколько статей .

ответ

2

Запросы против поиска elastics, которые используют подстановочные знаки (например, *), должны быть одним токеном. По умолчанию токены разделяются пробелом. «Том Круз» - это два токена.

Если вам нужно включить несколько токенов, подумайте о внедрении пользовательского репозитория данных Spring Data ES и используйте следующий QueryBuilder API Elasticsearch. Что-то вроде этого:

NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); 

QueryBuilder matchPhraseQuery = QueryBuilders.matchPhrasePrefixQuery("userName", "Tom Cruise"); 

QueryBuilder nestedQuery = QueryBuilders.nestedQuery("userAccount", matchPhraseQuery); 

nativeSearchQueryBuilder.withQuery(nestedQuery); 

NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build(); 

//auto wire elastic search template 
FacetedPage<EsUser> results = template.queryForPage(nativeSearchQuery, EsUser.class); 

 Смежные вопросы

  • Нет связанных вопросов^_^