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 в результате.

Спасибо за любые советы и любую помощь в решении этой проблемы.

С уважением, Камил

0 ответов

Другие вопросы по тегам