Overview
A full-text index is a type of index specialized for efficient searching for string
or text
properties, especially in large text fields like descriptions, comments, or articles.
Full-text indexes work by breaking down the text into smaller segments called tokens. When a query is performed, the search engine matches specified keywords against these tokens instead of the original full text, allowing for faster retrieval of relevant results. This approach enables keyword matching and partial matches.
Showing Full-text Indexes
To retrieve information about full-text indexes in the current graphset:
// Shows all full-text indexes
show().fulltext()
// Show all node full-text indexes
show().node_fulltext()
// Show all edge full-text indexes
show().edge_fulltext()
The information about full-text indexes is organized into the _nodeFulltext
or _edgeFulltext
table. Each table includes provides essential details about each full-text index:
Field |
Description |
---|---|
name |
Full-text index name. |
properties |
The property of the full-text index. |
schema |
The schema of the full-text index. |
status |
Full-text index status, which can be DONE or CREATING . |
Creating a Full-text Index
You can create a node or edge full-text index using the create().node_fulltext()
or create().edge_fulltext()
statement. Note that each property can only have one full-text index. The full-text index creation runs as a job, you may run show().job(<id?>)
afterward to verify the success of the creation.
System properties in Ultipa are inherently optimized for query performance and have built-in efficiencies. They do not support full-text indexing.
// Creates a node full-text index
create().node_fulltext(@<schema>.<property>, "<fulltextName>")
// Creates an edge full-text index
create().edge_fulltext(@<schema>.<property>, "<fulltextName>")
Method | Param | Description |
---|---|---|
node_fulltext() or edge_fulltext() |
@<schema>.<property> |
Specifies the string or text property and its schema. |
<fulltextName> |
The name of the full-text index. Naming conventions are:
|
To create a full-text index named prodDesc
for the property description
of product
nodes:
create().node_fulltext(@product.description, "proDesc")
To create a full-text index named review
for the property content
of review
edges:
create().edge_fulltext(@review.content, "review")
Dropping a Full-text Index
You can drop a node or edge full-text index using the drop().node_fulltext()
or drop().edge_fulltext()
statement. Dropping a full-text index does not affect the actual property values stored in shards.
A property with a full-text index cannot be dropped until the full-text index is deleted.
To drop the node full-text index proDesc
:
drop().node_fulltext("proDesc")
To drop the edge full-text index review
:
drop().edge_fulltext("review")
Using Full-text Indexes
To use a full-text index in filters, use the syntax {~<fulltextName> contains "<keyword1> <keyword2> ..."}
:
- The
~
symbol marks the full-text index. - The operator
contains
checks if the segmented tokens in the full-text index include all the specified keywords. - Multiple keywords should be separated by spaces. If a double quotation mark appears in a keyword, prefix it with a backslash (
\
).
There are two search modes:
- Precise search matches exact tokens to keywords.
- Fuzzy search occurs when a keyword ends with an asterisk (
*
), matching tokens that begin with the keyword.
To find nodes using the full-text index prodDesc
where tokens include both "graph" and "database":
find().nodes({~prodDesc contains "graph database"}) as n
return n
To find nodes using the full-text index prodDesc
where tokens include "graph" or "database":
find().nodes({~prodDesc contains "graph" || ~prodDesc contains "database"}) as n
return n
To find nodes using the full-text index prodDesc
where tokens include "graph" and start with "ult":
find().nodes({~prodDesc contains "graph ult*"}) as n
return n
To find paths within 5 steps between nodes where the full-text index companyName
starts with "Sequoia" and nodes where it starts with "Hillhouse":
ab().src({~companyName contains "Sequoia*"}).dest({~companyName contains "Hillhouse*"}).depth(:5) as p
return p
Note that in Path Template and K-Hop Template queries, full-text indexes only apply to the first node template. For example, the query below is not supported:
n().e().n({~name contains "Good"}) as p
return p
You can revise this query as follows:
find.nodes({~name contains "Good"}) as dest
n().e().n({_id == dest._id}) as p
return p