Reading Time: 3 minutes

Hello Graphistas,

Are you missing this series 🙂 ?

Welcome back again in the series of Neo4j with Scala 😉 . Let’s start our journey again. Till now we have talked and learnt about the use of Neo4j with Scala and how easily we can integrated both two amazing technologies.

Before starting the blog here is recap :

ElasticSearch is a modern search and analytic engine based on Apache Lucene. ElasticSearch is a full-text search engine and is highly scalable. It allows RESTful web interface and schema-free documents. ElasticSearch is able to achieve fast search responses because it searches an index instead of searching the text directly. ElasticSearch also provides the capability of store data but we shouldn’t use it as a primary database, because ES does not provide following support :

Security: ES does not provide any access control and authentication. Maturity of tools: ES does not provide mature client libraries and 3rd party tools , it makes developer life much harder. Transaction: ES doesn’t provide transaction and processing for data manipulation. Long Computation: ES c ommands for searching data are not suited to “large” scans of data and advanced computation on the database side. Durability:

ES is scalable and distributed but backup and durability is not high as much as in other database. You can lose your data, if you are going to make it primary database.

These are some concern areas when we are going to use ES. Neo4j provides the way to overcome from all the concern which we mention above with ES and also provides full text search with the 3.x version.

We can use cypher keywords “CONTAINS”, “STARTS WITH”, “ENDS WITH” for the full text search but it is limited to the single schema. So when we will try to use it with multiple schema we have to use “UNION” key word and have to implement multiple cypher query.

MATCH (r:Restaurant) WHERE r.name STARTS WITH {search_term} RETURN count(*); UNION MATCH (c:City) WHERE c.name CONTAINS {search_term} RETURN count(*); UNION MATCH (a:Address) WHERE a.name ENDS WITH {search_term} RETURN count(*);

But this will work only for the limited schema. when you have to make full text searching on the multiples schemas, it is better to use indexes and it will be better choice to gain it. We have to make changes these changes (which mention below) in the conf file.

# Set this parameter equal to true to enable it dbms.auto_index.nodes.enabled=true # A list of node property names (comma separated) that will be indexed by default. dbms.auto_index.nodes.keys=country

After making changes in the conf, we have to restart the neo4j and create node.

CREATE (c:Country {country:"india"})

Now we have almost finished with the primary set-up. Now to see the whole picture we have to start the neo4j-shell and run this command.

index --get-config node_auto_index Output : { "provider": "lucene", "type": "exact" }

Great, we are ready …. wait here we find “exact” so now what can we do? We run the following command to change it.

index --set-config node_auto_index type fulltext Output : INDEX CONFIGURATION CHANGED, INDEX DATA MAY BE INVALID

When we run the above cypher it leads to a very specific information, what do we do here? we can simply reset the name property of each type of node we want to index to itself.

MATCH (c:Country) SET c.country = c.country

Now we have done with our indexing work and ready for the test the result. Run this command for the searching in neo4j :

START n=node:node_auto_index("country:*india*") RETURN n;

Here we see that how can we use neo4j for the full text search, with Neo4j we get the advantages of database with the searching.. This is a sample example on very less amount of data but we can use it on the large amount of data effectively.

I hope it will help you to set-up Full Text Search with Neo4j.

Thanks 🙂 .

Reference:

Automatic Full Text Search on Neo4j3.x