Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.idea
*.iml
out
target
plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -220,19 +220,35 @@ public class ElasticSearchService implements GrailsApplicationAware {
mappings = elasticSearchContextHolder.mapping.values()
}

int perLoop = elasticSearchContextHolder.config.maxBulkRequest ?: 500
mappings.each { scm ->
if (scm.root) {
if (operationType == INDEX_REQUEST) {
LOG.debug("Indexing all instances of ${scm.domainClass}")
} else if (operationType == DELETE_REQUEST) {
LOG.debug("Deleting all instances of ${scm.domainClass}")
}
scm.domainClass.metaClass.invokeStaticMethod(scm.domainClass.clazz, "getAll", null).each {
if (operationType == INDEX_REQUEST) {
indexRequestQueue.addIndexRequest(it)
} else if (operationType == DELETE_REQUEST) {
indexRequestQueue.addDeleteRequest(it)
long lastId = 0
long maxId = scm.domainClass.metaClass.invokeStaticMethod(scm.domainClass.clazz, "withCriteria", {
projections {
max('id')
}
})[0]
while(lastId < maxId) {
scm.domainClass.metaClass.invokeStaticMethod(scm.domainClass.clazz, "withTransaction", { status ->
scm.domainClass.metaClass.invokeStaticMethod(scm.domainClass.clazz, "withNewSession", { session ->
scm.domainClass.metaClass.invokeStaticMethod(scm.domainClass.clazz, "findAllByIdGreaterThan", lastId, [ max: perLoop, sort: 'id', order: 'asc' ]).each {
if (operationType == INDEX_REQUEST) {
indexRequestQueue.addIndexRequest(it)
} else if (operationType == DELETE_REQUEST) {
indexRequestQueue.addDeleteRequest(it)
}
lastId = it.id
}
indexRequestQueue.executeRequests()
session.clear()
})
})
}
} else {
LOG.debug("${scm.domainClass.clazz} is not a root searchable class and has been ignored.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ class ClientNodeFactoryBean implements FactoryBean {
LOG.info "Using ElasticSearch data path: ${dataPath}"
}

def clusterName = elasticSearchContextHolder.config.cluster.name
if (clusterName) {
nb.settings.put('cluster.name', clusterName as String)
LOG.info "Using ElasticSearch cluster name: ${clusterName}"
}

// Configure the client based on the client mode
switch (clientMode) {
case 'local':
Expand All @@ -69,12 +75,15 @@ class ClientNodeFactoryBean implements FactoryBean {
break;

case 'transport':
def transportSettings = ImmutableSettings.settingsBuilder()
// Use the "sniff" feature of transport client ?
if(elasticSearchContextHolder.config.client.transport.sniff) {
transportClient = new TransportClient(ImmutableSettings.settingsBuilder().put("client.transport.sniff", true))
} else {
transportClient = new TransportClient()
transportSettings.put("client.transport.sniff", true)
}
if (clusterName) {
transportSettings.put('cluster.name', clusterName as String)
}
transportClient = new TransportClient(transportSettings)

// Configure transport addresses
if (!elasticSearchContextHolder.config.client.hosts) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,24 +45,36 @@ class DomainDynamicMethodsUtils {
// Only inject the methods if the domain is mapped as "root"
if (elasticSearchContextHolder.getMappingContext(domainCopy)?.root) {
// Inject the search method
domain.metaClass.'static'.search << { String q, Map params = [indices: domainCopy.packageName ?: domainCopy.propertyName, types: domainCopy.clazz] ->
domain.metaClass.'static'.search << { String q, Map params = [:] ->
params.indices = domainCopy.packageName ?: domainCopy.propertyName
params.types = domainCopy.clazz
elasticSearchService.search(q, params)
}
domain.metaClass.'static'.search << { Map params = [indices: domainCopy.packageName ?: domainCopy.propertyName, types: domainCopy.clazz], Closure q ->
domain.metaClass.'static'.search << { Map params = [:], Closure q ->
params.indices = domainCopy.packageName ?: domainCopy.propertyName
params.types = domainCopy.clazz
elasticSearchService.search(params, q)
}
domain.metaClass.'static'.search << { Closure q, Map params = [indices: domainCopy.packageName ?: domainCopy.propertyName, types: domainCopy.clazz] ->
domain.metaClass.'static'.search << { Closure q, Map params = [:] ->
params.indices = domainCopy.packageName ?: domainCopy.propertyName
params.types = domainCopy.clazz
elasticSearchService.search(params, q)
}

// Inject the countHits method
domain.metaClass.'static'.countHits << { String q, Map params = [indices: domainCopy.packageName ?: domainCopy.propertyName, types: domainCopy.clazz] ->
domain.metaClass.'static'.countHits << { String q, Map params = [:] ->
params.indices = domainCopy.packageName ?: domainCopy.propertyName
params.types = domainCopy.clazz
elasticSearchService.countHits(q, params)
}
domain.metaClass.'static'.countHits << { Map params = [indices: domainCopy.packageName ?: domainCopy.propertyName, types: domainCopy.clazz], Closure q ->
domain.metaClass.'static'.countHits << { Map params = [:], Closure q ->
params.indices = domainCopy.packageName ?: domainCopy.propertyName
params.types = domainCopy.clazz
elasticSearchService.countHits(params, q)
}
domain.metaClass.'static'.countHits << { Closure q, Map params = [indices: domainCopy.packageName ?: domainCopy.propertyName, types: domainCopy.clazz] ->
domain.metaClass.'static'.countHits << { Closure q, Map params = [:] ->
params.indices = domainCopy.packageName ?: domainCopy.propertyName
params.types = domainCopy.clazz
elasticSearchService.countHits(params, q)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ public void installMappings(Collection<SearchableClassMapping> mappings) {
installedIndices.add(scm.getIndexName());
LOG.debug(elasticMapping.toString());

// Wait for the index to be ready
elasticSearchClient.admin().cluster().prepareHealth(scm.getIndexName())
.setWaitForYellowStatus()
.execute().actionGet();

// If the index already exists, ignore the exception
} catch (IndexAlreadyExistsException iaee) {
LOG.debug("Index " + scm.getIndexName() + " already exists, skip index creation.");
Expand Down