Jeowkes
Jeowkes

Reputation: 501

Grails Elasticsearch plugin issues

I am new to Elasticsearch and am using the revived grails plugin "elasticsearch:0.0.4.6".

I wanted to implement a search for a User by their firstName, surname or username, which returns the full domain instance. I have a 2 domain classes:

User:

class User {

String firstName
String surname

static hasOne = [profile:Profile]
static hasMany = [friends:User]

static mappedBy  = [ friends: 'friends' ]

static searchable = {
    profile component:true
    only = ['firstName', 'surname', 'profile']
}
...

Profile:

class Profile {

String username
String status
byte[] photo

static belongsTo = [user:User]

static searchable = true
...
}

I made the classes "searchable = true" and then created the following search:

def res = User.search("${params.friendSearch}").searchResults

This found the correct instances, but now when a user adds a photo to their profile, it suceeds but I recieve a never ending loop of the following error:

ERROR index.IndexRequestQueue - Failed bulk item: MapperParsingException[failed to parse [photo]]; nested: NumberFor matException[For input string: the photos base64inputstring

I dont really get what is happening, but i figure it must be something to do with elasticsearch being unable to index the photo data. Can somebody provide an explanation?

I then experimented with searchables custom mapping options -

etc

Nothing worked. Eventually I added

and it stopped the error from occuring and allowed me to find users based on the criteria i mentioned above. However, because of the "only" limit, it means that the User instances returned by the seach have a photo property equal to null, but i need this value!

What am i doing wrong? Can anyone advise me on the best course of action to take or any misunderstandings i have about Elasticsearch? Thanks

Upvotes: 0

Views: 471

Answers (1)

daptordarattler
daptordarattler

Reputation: 96

I think you might have to exclude the byte property photo from the searchable fields like so:

class Profile {

String username
String status
byte[] photo

static belongsTo = [user:User]

static searchable = {
  except = ['photo']
}

This will exclude the property photo from being indexed and search. Hence the output of converting the byte format to string format will not fail.

Also maybe you might need a custom convertor to change the byte(string) to something more usable in the results?

Upvotes: 1

Related Questions