diff --git a/Examples/GeoShapeQueryExample.md b/Examples/GeoShapeQueryExample.md
new file mode 100644
index 00000000..5854d9f7
--- /dev/null
+++ b/Examples/GeoShapeQueryExample.md
@@ -0,0 +1,128 @@
+# GeoShape Fields Usage In RediSearch
+
+NRedisStack now supports GEOSHAPE field querying.
+
+Any object that serializes the [well-known text (WKT)](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) as a `string` can be used with NRedisStack.
+
+Using GeoShape fields in searches with the [NetTopologySuite](https://github.com/NetTopologySuite/NetTopologySuite) library.
+
+## Example
+
+### Modules Needed
+
+```c#
+using StackExchange.Redis;
+using NRedisStack.RedisStackCommands;
+using NRedisStack.Search;
+using NetTopologySuite.Geometries;
+using NetTopologySuite.IO;
+```
+
+### Setup
+
+```csharp
+// Connect to the Redis server:
+var redis = ConnectionMultiplexer.Connect("localhost");
+var db = redis.GetDatabase();
+// Get a reference to the database and for search commands:
+var ft = db.FT();
+
+// Create WTKReader and GeometryFactory objects:
+WKTReader reader = new WKTReader();
+GeometryFactory factory = new GeometryFactory();
+
+```
+
+### Create the index
+
+```csharp
+ft.Create(index, new Schema().AddGeoShapeField("geom", GeoShapeField.CoordinateSystem.FLAT));
+```
+
+### Prepare the data
+
+```csharp
+Polygon small = factory.CreatePolygon(new Coordinate[]{new Coordinate(1, 1),
+new Coordinate(1, 100), new Coordinate(100, 100), new Coordinate(100, 1), new Coordinate(1, 1)});
+db.HashSet("small", "geom", small.ToString());
+
+Polygon large = factory.CreatePolygon(new Coordinate[]{new Coordinate(1, 1),
+new Coordinate(1, 200), new Coordinate(200, 200), new Coordinate(200, 1), new Coordinate(1, 1)});
+db.HashSet("large", "geom", large.ToString());
+```
+
+## Polygon type
+
+### Querying within condition
+
+```csharp
+Polygon within = factory.CreatePolygon(new Coordinate[]{new Coordinate(0, 0),
+new Coordinate(0, 150), new Coordinate(150, 150), new Coordinate(150, 0), new Coordinate(0, 0)});
+
+SearchResult res = ft.Search(index, new Query("@geom:[within $poly]")
+ .AddParam("poly", within.ToString()) // Note serializing the argument to string
+ .Dialect(3)); // DIALECT 3 is required for this query
+```
+
+The search result from redis is:
+
+```bash
+1) (integer) 1
+2) "small"
+3) 1) "geom"
+ 2) "POLYGON ((1 1, 1 100, 100 100, 100 1, 1 1))"
+```
+
+Use the reader to get the polygon:
+
+```csharp
+reader.Read(res.Documents[0]["geom"].ToString());
+```
+
+### Querying contains condition
+
+```csharp
+Polygon contains = factory.CreatePolygon(new Coordinate[]{new Coordinate(2, 2),
+new Coordinate(2, 50), new Coordinate(50, 50), new Coordinate(50, 2), new Coordinate(2, 2)});
+
+res = ft.Search(index, new Query("@geom:[contains $poly]")
+ .AddParam("poly", contains.ToString()) // Note serializing the argument to string
+ .Dialect(3)); // DIALECT 3 is required for this query
+
+```
+
+Our search result:
+
+```bash
+1) (integer) 2
+2) "small"
+3) 1) "geom"
+ 2) "POLYGON ((1 1, 1 100, 100 100, 100 1, 1 1))"
+4) "large"
+5) 1) "geom"
+ 2) "POLYGON ((1 1, 1 200, 200 200, 200 1, 1 1))"
+```
+
+### Searching with Coordinates
+
+```csharp
+Point point = factory.CreatePoint(new Coordinate(10, 10));
+db.HashSet("point", "geom", point.ToString());
+
+res = ft.Search(index, new Query("@geom:[within $poly]")
+ .AddParam("poly", within.ToString()) // Note serializing the argument to string
+ .Dialect(3)); // DIALECT 3 is required for this query
+
+```
+
+Our search result:
+
+```bash
+1) (integer) 2
+2) "small"
+3) 1) "geom"
+ 2) "POLYGON ((1 1, 1 100, 100 100, 100 1, 1 1))"
+4) "point"
+5) 1) "geom"
+ 2) "POINT (10 10)"
+```
diff --git a/src/NRedisStack/NRedisStack.csproj b/src/NRedisStack/NRedisStack.csproj
index 9b698a4c..11b92832 100644
--- a/src/NRedisStack/NRedisStack.csproj
+++ b/src/NRedisStack/NRedisStack.csproj
@@ -15,8 +15,9 @@
+
-
+
diff --git a/src/NRedisStack/Search/Query.cs b/src/NRedisStack/Search/Query.cs
index baa41598..3f77d67e 100644
--- a/src/NRedisStack/Search/Query.cs
+++ b/src/NRedisStack/Search/Query.cs
@@ -617,6 +617,7 @@ public Query SetSortBy(string field, bool? ascending = null)
/// Parameters can be referenced in the query string by a $ , followed by the parameter name,
/// e.g., $user , and each such reference in the search query to a parameter name is substituted
/// by the corresponding parameter value.
+ /// Note: when calling this function with an externally supplied parameter, value should be a string.
///
///
/// can be String, long or float
diff --git a/src/NRedisStack/Search/Schema.cs b/src/NRedisStack/Search/Schema.cs
index 442b2a72..8aaabd08 100644
--- a/src/NRedisStack/Search/Schema.cs
+++ b/src/NRedisStack/Search/Schema.cs
@@ -1,4 +1,5 @@
using NRedisStack.Search.Literals;
+using static NRedisStack.Search.Schema.GeoShapeField;
using static NRedisStack.Search.Schema.VectorField;
namespace NRedisStack.Search
@@ -13,6 +14,7 @@ public enum FieldType
{
Text,
Geo,
+ GeoShape,
Numeric,
Tag,
Vector
@@ -38,6 +40,7 @@ internal void AddSchemaArgs(List