UltipaDocs
Try Playground
  • Introduction
  • Terminologies
    • Graphset
    • Schema
    • Property
    • Constraints
    • Insert
    • Overwrite or Insert
    • Upsert
    • Update
    • Delete
    • Find Nodes
    • Find Edges
      • AB
      • Autonet
      • Spread
      • Path Template
      • K-Hop
      • K-Hop Template
    • GROUP BY
    • ORDER BY
    • SKIP
    • LIMIT
    • WHERE
    • RETURN
    • WITH
    • UNCOLLECT
    • UNION
    • UNION ALL
    • CALL
    • All Functions
    • Path Functions
    • Aggregate Functions
    • Mathematical Functions
    • Trigonometric Functions
    • String Functions
    • List Functions
    • Datetime Functions
    • Spatial Functions
    • Table Functions
    • Null Functions
    • Type Conversion Functions
  • Operators
  • Expressions
    • Index
    • Full-text Index
    • Vector Index
    • Cache
    • Overview
    • Managing HDC Graphs
    • HDC Graph Queries
    • Process
    • Job
    • Execution Plan
    • Alias
    • Filter
    • Values and Types
    • Data Flow in Queries
    • Comments
    • Reserved Words
  • Access Control
  1. Docs
  2. /
  3. UQL
  4. /
  5. Query Acceleration

Full-text Index

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. Full-text indexes support both precise and fuzzy matches.

Showing Full-text Indexes

To retrieve information about full-text indexes in the current graphset:

UQL
// 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 provides essential details about each full-text index:

Field
Description
nameFull-text index name.
propertiesThe property of the full-text index.
schemaThe schema of the full-text index.
statusFull-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 include built-in efficiencies. They do not support full-text indexing.

Syntax
// Creates a node full-text index
create().node_fulltext(@<schema>.<property>, "<fulltextName>")

// Creates an edge full-text index
create().edge_fulltext(@<schema>.<property>, "<fulltextName>")
MethodParamDescription
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:
  • 2 to 64 characters.
  • Begins with a letter.
  • Allowed characters: letters (A-Z, a-z), numbers (0-9) and underscores (_).
Names must be unique among nodes and among edges, but a node full-text index and an edge full-text index may share the same name.

To create a full-text index named prodDesc for the property description of product nodes:

UQL
create().node_fulltext(@product.description, "prodDesc")

To create a full-text index named review for the property content of review edges:

UQL
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.

NOTE

A property with a full-text index cannot be dropped until the full-text index is deleted.

To drop the node full-text index prodDesc:

UQL
drop().node_fulltext("prodDesc")

To drop the edge full-text index review:

UQL
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 (\) to escape.

There are two search modes for full-text indexes:

  • Precise search matches exact tokens to keywords.
  • Fuzzy search occurs when a keyword ends with an asterisk (*), matching tokens that begin with the keyword.

Retrieving Nodes or Edges

To find nodes using the full-text index prodDesc where their tokens include "graph" and "database":

UQL
find().nodes({~prodDesc contains "graph database"}) as n
return n

To find nodes using the full-text index prodDesc where their tokens include "graph" or "database":

UQL
find().nodes({~prodDesc contains "graph" || ~prodDesc contains "database"}) as n
return n

To find edges using the full-text index review where their tokens include "graph" and those start with "ult":

UQL
find().edges({~review contains "graph ult*"}) as e
return e

Retrieving Paths

Using the ab() query to find paths within 5 steps, with the full-text index companyName applied to both the source and destination nodes:

UQL
ab().src({~companyName contains "Sequoia*"}).dest({~companyName contains "Hillhouse*"}).depth(:5) as p
return p

Note: Full-text indexes only apply to the first node in a Path Template or a K-Hop Template when retrieving paths.

For example, this query is not supported:

UQL - Not supported
n().e().n({~prodDesc contains "graph"}) as p
return p

You may revise the query as follows:

UQL
find().nodes({~prodDesc contains "graph"}) as dest
n().e().n({_id == dest._id}) as p
return p

This query is not supported either:

UQL - Not supported
n().e({~review contains "ult*"}).n() as p
return p

You may revise the query as follows:

UQL
find().edges({~review contains "ult*"}) as e
n().e({_uuid == e._uuid}).n() as p
return p