ElasticSearch в Grails, поиск не даст результатов, если поле домена имеет значение с символом @
Я столкнулся с проблемой, когда менял плагин Searchable на плагин ElasticSearch (:asticsearch:0.0.3.8) для Grails (2.4.4).
Допустим, у меня есть объект домена и сервис:
class Person {
String firstName
String lastName
String email
static constraints = {
id bindable: true
firstName blank: false
lastName blank: false
email blank: false, unique: true, email: true
}
static searchable = {
root true
only = ['id', 'firstName', 'lastName', 'email']
}
}
class SearchService {
List<Person> findPersons(String searchPhrase) {
Innovator.search(searchPhrase + '*').searchResults
}
}
Мой файл Config.groovy содержит следующий конфиг:
elasticSearch {
client.mode = 'local'
index.store.type = 'memory'
date.formats = []
defaultExcludedProperties = ["password"]
disableAutoIndex = false
datastoreImpl = 'hibernateDatastore'
bulkIndexOnStartup = true
maxBulkRequest = 500
}
Предположим, что у нас есть следующий человек в БД:
Person(firstName: 'Julius', lastName: 'Caesar', email: 'julius.caesar@domain.com')
Теперь, когда я вызываю findPersons ('Julius') или findPersons ('Caesar') или findPersons ('Jul') и т. Д., В результате я получаю список с одним объектом Person. Но когда я пытаюсь выполнить поиск по фразе с символом '@', например: findPersons ('julius.caesar@doma ') или findPersons ('julius.caesar@domain.com'), я не получаю никаких результатов, однако findPersons (' julius.caesar ') в порядке. Аналоговый код в поисковом плагине работает правильно.
Я пытался удалить символ "*", но это не помогло.
В качестве обходного пути я изменил поисковое закрытие на:
static searchable = {
root true
email index : 'not_analyzed'
only = ['id', 'firstName', 'lastName', 'email']
}
и метод findPersons для:
List<Person> findPersons(String searchPhrase) {
if(!searchPhrase.contains('@'){
searchPhrase += '*'
}
Innovator.search(searchPhrase).searchResults
}
Теперь я могу использовать findPersons ('julius.caesar@domain.com '), чтобы найти объект Person. Но это точное значение, и я хотел бы также использовать поиск префикса для поля электронной почты. Например: findPersons ('julius.caesar@doma ') также должен возвращать Person в результате.
Спасибо за любые советы и любую помощь в решении этой проблемы.
С уважением, Камил