0

I'm trying to implement Lucene query for multi-word autosuggest full-text search.

For example, I'd like to be able to search for Arnold Schwarzenegger in database.

Right now I can do the fuzzy search by one word:

Name.primaryName:Shwarzengger~

which returns:

Arnold Schwarzenegger
Katherine Schwarzenegger
Patrick Schwarzenegger
Christian Schwarzenegger
Aurelia Schwarzenegger
Patrick M. Knapp Schwarzenegger
Brian Schwarzenegger
Christina Schwarzenegger

but how to do the same for a multi-word term?

For example the following query:

Name.primaryName:arn Shwarzengger~

doesn't work with the following error:

Neo.ClientError.Procedure.ProcedureCallFailed: Failed to invoke procedure apoc.index.nodes: Caused by: java.lang.NullPointerException: field must not be null

How to properly construct multi-word search term?

alexanoid
  • 24,051
  • 54
  • 210
  • 410

1 Answers1

1

You can use the Luchene language to search:

CALL apoc.index.nodes('Company','name:Ne* AND employees:Ma*')

https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_add_document_to_index

For example, break the initial query and construct a fuzzy one:

WITH "arnold schwarzenegger" AS queryString
WITH split(queryString, " ") AS terms,
     "primaryName" AS key
WITH REDUCE(
       acc = "", 
       i IN range(0, size(terms) - 2) | 
       acc + key + ":" + terms[i] + " OR "
     ) + key + ":" + terms[size(terms) - 1] 
     AS query
CALL apoc.index.nodes('Node', query) YIELD node
RETURN node
stdob--
  • 28,222
  • 5
  • 58
  • 73