Compass - Lucene Full text search. Structure and Best Practice.
- by Rob
Hi,
I have played about with the tutorial and Compass itself for a bit now. I have just started to ramp up the use of it and have found that the performance slows drastically. I am certain that this is due to my mappings and the relationships that I have between entities and was looking for suggestions about how this should be best done.
Also as a side question I wanted to know if a variable is in an @searchableComponent but is not defined as @searchable when the component object is pulled out of Compass results will you be able to access that variable?
I have 3 main classes that I want to search on - Provider, Location and Activity. They are all inter-related - a Provider can have many locations and activites and has an address; A Location has 1 provider, many activities and an address; An activity has 1 provider and many locations.
I have a join table between activity and Location called ActivityLocation that can later provider additional information about the relationship. My classes are mapped to compass as shown below for provider location activity and address. This works but gives a huge index and searches on it are comparatively slow, any advice would be great.
Cheers,
Rob
@Searchable
public class AbstractActivity extends LightEntity implements Serializable
{
/**
* Serialisation ID
*/
private static final long serialVersionUID = 3445339493203407152L;
@SearchableId (name="actID")
private Integer activityId =-1;
@SearchableComponent()
private Provider provider;
@SearchableComponent(prefix = "activity")
private Category category;
private String status;
@SearchableProperty (name = "activityName")
@SearchableMetaData (name = "activityshortactivityName")
private String activityName;
@SearchableProperty (name = "shortDescription")
@SearchableMetaData (name = "activityshortDescription")
private String shortDescription;
@SearchableProperty (name = "abRating")
@SearchableMetaData (name = "activityabRating")
private Integer abRating;
private String contactName;
private String phoneNumber;
private String faxNumber;
private String email;
private String url;
@SearchableProperty (name = "completed")
@SearchableMetaData (name = "activitycompleted")
private Boolean completed= false;
@SearchableProperty (name = "isprivate")
@SearchableMetaData (name = "activityisprivate")
private Boolean isprivate= false;
private Boolean subs= false;
private Boolean newsfeed= true;
private Set news = new HashSet(0);
private Set ActivitySession = new HashSet(0);
private Set payments = new HashSet(0);
private Set userclub = new HashSet(0);
private Set ActivityOpeningTimes = new HashSet(0);
private Set Events = new HashSet(0);
private User creator;
private Set userInterested = new HashSet(0);
boolean freeEdit = false;
private Integer activityType =0;
@SearchableComponent (maxDepth=2)
private Set activityLocations = new HashSet(0);
private Double userRating = -1.00;
Getters and Setters ....
@Searchable
public class AbstractLocation extends LightEntity implements Serializable
{
/**
* Serialisation ID
*/
private static final long serialVersionUID = 3445339493203407152L;
@SearchableId (name="locationID")
private Integer locationId;
@SearchableComponent (prefix = "location")
private Category category;
@SearchableComponent (maxDepth=1)
private Provider provider;
@SearchableProperty (name = "status")
@SearchableMetaData (name = "locationstatus")
private String status;
@SearchableProperty
private String locationName;
@SearchableProperty (name = "shortDescription")
@SearchableMetaData (name = "locationshortDescription")
private String shortDescription;
@SearchableProperty (name = "abRating")
@SearchableMetaData (name = "locationabRating")
private Integer abRating;
private Integer boolUseProviderDetails;
@SearchableProperty (name = "contactName")
@SearchableMetaData (name = "locationcontactName")
private String contactName;
@SearchableComponent
private Address address;
@SearchableProperty (name = "phoneNumber")
@SearchableMetaData (name = "locationphoneNumber")
private String phoneNumber;
@SearchableProperty (name = "faxNumber")
@SearchableMetaData (name = "locationfaxNumber")
private String faxNumber;
@SearchableProperty (name = "email")
@SearchableMetaData (name = "locationemail")
private String email;
@SearchableProperty (name = "url")
@SearchableMetaData (name = "locationurl")
private String url;
@SearchableProperty (name = "completed")
@SearchableMetaData (name = "locationcompleted")
private Boolean completed= false;
@SearchableProperty (name = "isprivate")
@SearchableMetaData (name = "locationisprivate")
private Boolean isprivate= false;
@SearchableComponent
private Set activityLocations = new HashSet(0);
private Set LocationOpeningTimes = new HashSet(0);
private Set events = new HashSet(0);
@SearchableProperty (name = "adult_cost")
@SearchableMetaData (name = "locationadult_cost")
private String adult_cost ="";
@SearchableProperty (name = "child_cost")
@SearchableMetaData (name = "locationchild_cost")
private String child_cost ="";
@SearchableProperty (name = "family_cost")
@SearchableMetaData (name = "locationfamily_cost")
private String family_cost ="";
private Double userRating = -1.00;
private Set costs = new HashSet(0);
private String cost_caveats ="";
Getters and Setters ....
@Searchable
public class AbstractActivitylocations implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1365110541466870626L;
@SearchableId (name="id")
private Integer id;
@SearchableComponent
private Activity activity;
@SearchableComponent
private Location location;
Getters and Setters.....
@Searchable
public class AbstractProvider extends LightEntity implements Serializable
{
private static final long serialVersionUID = 3060354043429663058L;
@SearchableId
private Integer providerId = -1;
@SearchableComponent (prefix = "provider")
private Category category;
@SearchableProperty (name = "businessName")
@SearchableMetaData (name = "providerbusinessName")
private String businessName;
@SearchableProperty (name = "contactName")
@SearchableMetaData (name = "providercontactName")
private String contactName;
@SearchableComponent
private Address address;
@SearchableProperty (name = "phoneNumber")
@SearchableMetaData (name = "providerphoneNumber")
private String phoneNumber;
@SearchableProperty (name = "faxNumber")
@SearchableMetaData (name = "providerfaxNumber")
private String faxNumber;
@SearchableProperty (name = "email")
@SearchableMetaData (name = "provideremail")
private String email;
@SearchableProperty (name = "url")
@SearchableMetaData (name = "providerurl")
private String url;
@SearchableProperty (name = "status")
@SearchableMetaData (name = "providerstatus")
private String status;
@SearchableProperty (name = "notes")
@SearchableMetaData (name = "providernotes")
private String notes;
@SearchableProperty (name = "shortDescription")
@SearchableMetaData (name = "providershortDescription")
private String shortDescription;
private Boolean completed = false;
private Boolean isprivate = false;
private Double userRating = -1.00;
private Integer ABRating = 1;
@SearchableComponent
private Set locations = new HashSet(0);
@SearchableComponent
private Set activities = new HashSet(0);
private Set ProviderOpeningTimes = new HashSet(0);
private User creator;
boolean freeEdit = false;
Getters and Setters...
Thanks for reading!!
Rob