Here is a working example of lucene index implementation on an array field.
Step 1:Implement the domain classes.
- ExampleRegion.java
- ExampleIdentifier.java
- SystemId.java
package examples;
import java.io.Serializable;
public class ExampleRegion implements Serializable {
private ExampleIdentifier exampleIdentifier;
public ExampleRegion() {}
public ExampleRegion(ExampleIdentifier exampleIdentifier) {
this.exampleIdentifier = exampleIdentifier;
}
public void setExampleIdentifier(ExampleIdentifier exampleIdentifier) {
this.exampleIdentifier = exampleIdentifier;
}
public ExampleIdentifier getExampleIdentifier() {
return this.exampleIdentifier;
}
}
package examples;
import java.io.Serializable;
public class ExampleIdentifier implements Serializable {
private String exampleId;
private SystemId[] systemIds;
public ExampleIdentifier() {}
public ExampleIdentifier(String exampleId, SystemId[] systemIds) {
this.exampleId = exampleId;
this.systemIds = systemIds;
}
public void setExampleId(String exampleId) {
this.exampleId = exampleId;
}
public void setSystemIds(SystemId[] systemIds) {
this.systemIds = systemIds;
}
public String getExampleId() {
return this.exampleId;
}
public SystemId[] getSystemIds() {
return this.systemIds;
}
}
package examples;
import java.io.Serializable;
public class SystemId implements Serializable {
private String id;
private String system;
public SystemId() {}
SystemId(String id, String system) {
this.id = id;
this.system = system;
}
public void setId(String id) {
this.id = id;
}
public void setSystem(String system) {
this.system = system;
}
}
Step 2:Build a jar file, such as
lucene_example-0.0.1.jar and then deploy it to a running Gemfire cluster:
deploy --jar=/Users/user1/build/libs/lucene_example-0.0.1.jar
Step 3:Create a lucene index (
name=arrayIndex) before creating the region (
name=exampleRegion).
create lucene index --name=arrayIndex --region=/exampleRegion --field=exampleIdentifier.systemIds.system --analyzer=DEFAULT --serializer=org.apache.geode.cache.lucene.FlatFormatSerializer
Step 4:Create a partition region (
name=exampleRegion) and put some sample data into this region:
create region --name=exampleRegion --type=PARTITION
put --region=/exampleRegion --key=1 --value="('exampleIdentifier': {'exampleId': '000000000','systemIds':[{'id': 'ID','system': 'ABC'}]})" --value-class="examples.ExampleRegion"
put --region=/exampleRegion --key="('id':'2')" --value="('exampleIdentifier': {'exampleId': '000000001','systemIds':[{'id': 'ID','system': 'ABC'}, {'id': 'ID1','system': 'CDE'}]})" --value-class="examples.ExampleRegion"
Step 5:Search the array field via lucene index by a correct syntax:
exampleIdentifier.systemIds.system instead of
exampleIdentifier.systemIds[0].system.
gfsh>search lucene --name=arrayIndex --region=/exampleRegion --queryString="exampleIdentifier.systemIds.system:CDE" --defaultField="exampleIdentifier.systemIds.system"
key | value | score
---------- | ------------------------------- | ----------
{'id':'2'} | examples.ExampleRegion@620c60d6 | 0.25811607