/neo4j-elasticsearch

Neo4j ElasticSearch Integration

Primary LanguageJavaApache License 2.0Apache-2.0

Neo4j Elastic{Search} Integration

Build Status

Integrates Neo4j change-feed with an ElasticSearch cluster.

The different versions of Neo4j (2.2.x, 2.3.x, 3.0.x, and 3.1.x are supported on different branches).

Approach

This Neo4j Kernel Extension updates an ElasticSearch instance or cluster with changes in the graph.

A transaction event listener checks changed Nodes against a given label, renders the whole node as json document and indexes all changes in bulk with ES.

Installation

  • Download the jar from the latest release.

  • Copy to $NEO4J_HOME/plugins or for Neo4j community to the plugins folder that you find on the Options pane.

  • Modify $NEO4J_HOME/conf/neo4j.conf accordingly (see the Example section)

  • Restart Neo4j

Example

Suppose that we keep nodes in our Neo4j instance labeled Person and Place, and that we want to index the values of the first_name and last_name properties of the former and name of the latter in two separate ElasticSearch indices named people and places. For that, we would add the following directives to conf/neo4j.conf:

elasticsearch.host_name=http://localhost:9200
elasticsearch.index_spec=people:Person(first_name,last_name), places:Place(name)

With that in place, Neo4j will now track changes to nodes labeled Person or Place and keep our ES instance running on localhost:9200 in sync.

To perform an initial import, you can force a commit by executing a Cypher query like:

MATCH n:Person
SET n.first_name = n.first_name, n.last_name = n.last_name;

MATCH n:Place
SET n.name = n.name;

ID / Labels fields

By default, the indexes created will contain fields for the Neo4j ID and Labels, named id and labels. These will be auto-created as searchable fields, but, if you’d prefer they not be included, simply add one or both of these lines to your conf/neo4j.conf file.

elasticsearch.include_id_field=false
elasticsearch.include_labels_field=false

Discovery

By default discovery (discovering of nodes within a cluster) is turned off. If you would like to turn discovery on, use the discovery option.

elasticsearch.discovery=true

Developing

To run the tests, run mvn test. Make sure that an elastic{search} server is running on localhost:9200.

Todo

  • Support indexing of relationships