I'm trying to use the Neo4j 2.1.5 regex matching in Cypher and running into
problems.
I need to implement a full text search on specific fields that a user has
access to. The access requirement is key and is what prevents me from just
dumping everything into a Lucene instance and querying that way. The
access system is dynamic and so I need to query for the set of nodes that a
particular user has access to and then within those nodes perform the
search. I would really like to match the set of nodes against a Lucene
query, but I can't figure out how to do that so I'm just using basic regex
matching for now. My problem is that Neo4j doesn't always return the
expected results.
For example, I have about 200 nodes with one of them being the following:
( i:node {name: "Linear Glass Mosaic Tiles", description: "Introducing our
new Rip Curl linear glass mosaic tiles. This Caribbean color combination of
greens and blues brings a warm inviting feeling to a kitchen backsplash or
bathroom. The colors work very well with white cabinetry or larger tiles.
We also carry this product in a small subway mosaic to give you some
options! SOLD OUT: Back in stock end of August. Call us to pre-order and
save 10%!"})
This query produces one result:
MATCH (p)-->(:group)-->(i:node)
WHERE (i.name =~ "(?i).*mosaic.*")
RETURN i
> Returned 1 row in 569 ms
But this query produces zero results even though the description property
matches the expression:
MATCH (p)-->(:group)-->(i:node)
WHERE (i.description=~ "(?i).*mosaic.*")
RETURN i
> Returned 0 rows in 601 ms
And this query also produces zero results even though it includes the name
property which returned results previously:
MATCH (p)-->(:group)-->(i:node)
WITH i, (p.name + i.name + COALESCE(i.description, "")) AS searchText
WHERE (searchText =~ "(?i).*mosaic.*")
RETURN i
> Returned 0 rows in 487 ms
MATCH (p)-->(:group)-->(i:node)
WITH i, (p.name + i.name + COALESCE(i.description, "")) AS searchText
RETURN searchText
>
...
SotoLinear Glass Mosaic Tiles Introducing our new Rip Curl linear glass
mosaic tiles. This Caribbean color combination of greens and blues brings a
warm inviting feeling to a kitchen backsplash or bathroom. The colors work
very well with white cabinetry or larger tiles. We also carry this product
in a small subway mosaic to give you some options! SOLD OUT: Back in stock
end of August. Call us to pre-order and save 10%!
...
I then tried to cache the search text on the nodes and I added an index to
see if that would change anything, but it still didn't produce any results.
CREATE INDEX ON :material(searchText)
MATCH (p)-->(:group)-->(i:node)
WHERE (i.searchText =~ "(?i).*mosaic.*")
RETURN i
> Returned 0 rows in 3182 ms
I then tried to simplify the data to reproduce the problem, but in this
simple case it works as expected:
MERGE (i:node {name: "Linear Glass Mosaic Tiles", description:
"Introducing our new Rip Curl linear glass mosaic tiles. This Caribbean
color combination of greens and blues brings a warm inviting feeling to a
kitchen backsplash or bathroom. The colors work very well with white
cabinetry or larger tiles. We also carry this product in a small subway
mosaic to give you some options! SOLD OUT: Back in stock end of August.
Call us to pre-order and save 10%!"})
WITH i, (
i.name + " " + COALESCE(i.description, "")
) AS searchText
WHERE searchText =~ "(?i).*mosaic.*"
RETURN i
> Returned 1 rows in 630 ms
What am I missing? I tried using the CYPHER 2.1.EXPERIMENTAL tag as well
but that didn't change any of the results.
--
You received this message because you are subscribed to the Google Groups
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.