diff -Naupr a/CMakeLists.txt c/CMakeLists.txt
--- a/CMakeLists.txt	2024-02-18 19:18:26.000000000 +0100
+++ c/CMakeLists.txt	2025-03-31 10:09:11.175008239 +0200
@@ -47,7 +47,7 @@ include(dependencies)
 include(Lucene++Docs)
 
 # Enable C++11
-set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD 17)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
 ####################################
diff -Naupr a/src/core/document/NumericField.cpp c/src/core/document/NumericField.cpp
--- a/src/core/document/NumericField.cpp	2024-02-18 19:18:26.000000000 +0100
+++ c/src/core/document/NumericField.cpp	2025-03-31 10:29:14.383300303 +0200
@@ -4,6 +4,10 @@
 // or the GNU Lesser General Public License.
 /////////////////////////////////////////////////////////////////////////////
 
+#include <boost/variant/get.hpp>
+#include <locale>
+#include <codecvt>
+ 
 #include "LuceneInc.h"
 #include "NumericField.h"
 #include "Field.h"
@@ -53,9 +57,23 @@ ReaderPtr NumericField::readerValue() {
 }
 
 String NumericField::stringValue() {
-    StringStream value;
-    value << fieldsData;
-    return value.str();
+    std::stringstream value;
+    
+    // Estrazione del valore numerico (come prima)
+    if (int* v = boost::get<int>(&fieldsData)) {
+        value << *v;
+    } else if (int64_t* v = boost::get<int64_t>(&fieldsData)) {
+        value << *v;
+    } else if (double* v = boost::get<double>(&fieldsData)) {
+        value << *v;
+    } else {
+        value << "0";
+    }
+    
+    std::string narrowStr = value.str();
+    std::wstring wideStr(narrowStr.begin(), narrowStr.end());
+    return String(wideStr);
+
 }
 
 int64_t NumericField::getNumericValue() {
diff -Naupr a/src/core/search/FieldDoc.cpp c/src/core/search/FieldDoc.cpp
--- a/src/core/search/FieldDoc.cpp	2024-02-18 19:18:26.000000000 +0100
+++ c/src/core/search/FieldDoc.cpp	2025-03-31 10:42:12.819612969 +0200
@@ -6,6 +6,7 @@
 
 #include "LuceneInc.h"
 #include "FieldDoc.h"
+#include <boost/variant/get.hpp>
 
 namespace Lucene {
 
@@ -19,14 +20,31 @@ FieldDoc::~FieldDoc() {
 String FieldDoc::toString() {
     StringStream buffer;
     buffer << ScoreDoc::toString() << L"[";
+    
+    bool first = true;
     for (Collection<ComparableValue>::iterator field = fields.begin(); field != fields.end(); ++field) {
-        if (field != fields.begin()) {
+        if (!first) {
             buffer << L", ";
         }
-        buffer << *field;
+        first = false;
+        
+        // Gestione del boost::variant
+        if (const std::wstring* s = boost::get<std::wstring>(&*field)) {
+            buffer << *s;
+        } else if (const int32_t* i = boost::get<int32_t>(&*field)) {
+            buffer << *i;
+        } else if (const int64_t* l = boost::get<int64_t>(&*field)) {
+            buffer << *l;
+        } else if (const double* d = boost::get<double>(&*field)) {
+            buffer << *d;
+        } else if (const uint8_t* b = boost::get<uint8_t>(&*field)) {
+            buffer << static_cast<int>(*b);
+        }
+        // Aggiungi altri tipi se necessario
     }
+    
     buffer << L"]";
     return buffer.str();
 }
 
-}
+} // namespace Lucene
diff -Naupr a/src/core/search/NumericRangeQuery.cpp c/src/core/search/NumericRangeQuery.cpp
--- a/src/core/search/NumericRangeQuery.cpp	2024-02-18 19:18:26.000000000 +0100
+++ c/src/core/search/NumericRangeQuery.cpp	2025-03-31 10:46:59.001580233 +0200
@@ -3,7 +3,7 @@
 // Distributable under the terms of either the Apache License (Version 2.0)
 // or the GNU Lesser General Public License.
 /////////////////////////////////////////////////////////////////////////////
-
+#include <boost/variant/get.hpp>
 #include "LuceneInc.h"
 #include "NumericRangeQuery.h"
 #include "_NumericRangeQuery.h"
@@ -131,17 +131,36 @@ String NumericRangeQuery::toString(const
         buffer << this->field << L":";
     }
     buffer << (minInclusive ? L"[" : L"{");
+    
+    // Gestione del valore minimo
     if (VariantUtils::isNull(min)) {
         buffer << L"*";
     } else {
-        buffer << min;
+        // Estrazione del valore dal variant
+        if (const int32_t* i = boost::get<int32_t>(&min)) {
+            buffer << *i;
+        } else if (const int64_t* l = boost::get<int64_t>(&min)) {
+            buffer << *l;
+        } else if (const double* d = boost::get<double>(&min)) {
+            buffer << *d;
+        }
     }
+    
     buffer << L" TO ";
+    
+    // Gestione del valore massimo (NOTA: c'è un bug nel codice originale che usa 'min' invece di 'max')
     if (VariantUtils::isNull(max)) {
         buffer << L"*";
     } else {
-        buffer << max;
+        if (const int32_t* i = boost::get<int32_t>(&max)) {
+            buffer << *i;
+        } else if (const int64_t* l = boost::get<int64_t>(&max)) {
+            buffer << *l;
+        } else if (const double* d = boost::get<double>(&max)) {
+            buffer << *d;
+        }
     }
+    
     buffer << (maxInclusive ? L"]" : L"}");
     buffer << boostString();
     return buffer.str();
diff -Naupr a/src/core/search/TermRangeQuery.cpp c/src/core/search/TermRangeQuery.cpp
--- a/src/core/search/TermRangeQuery.cpp	2024-02-18 19:18:26.000000000 +0100
+++ c/src/core/search/TermRangeQuery.cpp	2025-03-31 10:51:38.091670633 +0200
@@ -10,6 +10,7 @@
 #include "Collator.h"
 #include "StringUtils.h"
 #include "VariantUtils.h"
+#include <boost/variant/get.hpp>
 
 namespace Lucene {
 
@@ -72,22 +73,39 @@ String TermRangeQuery::toString(const St
         buffer << getField() << L":";
     }
     buffer << (includeLower ? L"[" : L"{");
+    
+    // Gestione del lowerTerm
     if (VariantUtils::isNull(lowerTerm)) {
         buffer << L"*";
     } else {
-        buffer << lowerTerm;
+        // Estrazione del valore stringa dal variant
+        if (const String* s = boost::get<String>(&lowerTerm)) {
+            buffer << *s;
+        } else if (const std::wstring* ws = boost::get<std::wstring>(&lowerTerm)) {
+            buffer << *ws;
+        }
+        // Aggiungi altri tipi se necessario
     }
+    
     buffer << L" TO ";
+    
+    // Gestione dell'upperTerm
     if (VariantUtils::isNull(upperTerm)) {
         buffer << L"*";
     } else {
-        buffer << upperTerm;
+        if (const String* s = boost::get<String>(&upperTerm)) {
+            buffer << *s;
+        } else if (const std::wstring* ws = boost::get<std::wstring>(&upperTerm)) {
+            buffer << *ws;
+        }
     }
+    
     buffer << (includeUpper ? L"]" : L"}");
     buffer << boostString();
     return buffer.str();
 }
 
+
 bool TermRangeQuery::equals(const LuceneObjectPtr& other) {
     if (LuceneObject::equals(other)) {
         return true;