diff --git a/docs/Query/FunctionScore.md b/docs/Query/FunctionScore.md
new file mode 100644
index 0000000000000000000000000000000000000000..219ccf963ea4b776ba92133cb594b1d5367c899b
--- /dev/null
+++ b/docs/Query/FunctionScore.md
@@ -0,0 +1,175 @@
+# Function Score Query
+
+> More info about function score query is in the [official elasticsearch docs][1]
+
+The function score query allows you to modify the score of documents that are retrieved by a query. This can be useful
+if, for example, a score function is computationally expensive and it is sufficient to compute the score on a filtered
+set of documents.
+
+## Example with linear decay function
+```JSON
+{
+  "query": {
+    "function_score": {
+      "query": {
+        "range": {
+          "price": {
+            "gte": 10,
+            "lte": 100
+          }
+        }
+      },
+      "functions": [
+        {
+          "linear": {
+            "price": {
+              "origin": 10,
+              "scale": 50,
+              "offset": 0,
+              "decay" : 0.5
+            }
+          }
+        }
+      ]
+    }
+  }
+}
+```
+
+In DSL
+
+```php
+$rangeQuery = new RangeQuery('price');
+$rangeQuery->addParameter(RangeQuery::GTE, 10);
+$rangeQuery->addParameter(RangeQuery::LTE, 100);
+$functionScoreQuery = new FunctionScoreQuery($rangeQuery);
+$functionScoreQuery->addDecayFunction(
+    'linear',
+    'price',
+    [
+        'origin' => 10,
+        'scale' => 50,
+        'offset' => 0,
+        'decay' => 0.5
+    ]
+);
+
+$search = new Search();
+$search->addQuery($functionScoreQuery);
+
+$queryArray = $search->toArray();
+```
+
+## Example weight function to multiply score of subset
+
+```JSON
+{
+  "query": {
+    "function_score": {
+      "query": {
+        "match_all": {}
+      },
+      "functions": [
+        {
+          "weight": 2,
+          "filter": {
+            "range": {
+              "price": {
+                "gte": 10,
+                "lte": 40
+              }
+            }
+          }
+        }
+      ]
+    }
+  }
+}
+```
+
+In DSL:
+
+```php
+$functionScoreQuery = new FunctionScoreQuery(new MatchAllQuery());
+$rangeFilter = new RangeFilter('price', ['gte' => 10, 'lte' => 100]);
+$functionScoreQuery->addWeightFunction(2, $rangeFilter);
+
+$search = new Search();
+$search->addQuery($functionScoreQuery);
+
+$queryArray = $search->toArray();
+```
+
+## Example Field Value Factor Function
+
+```php
+$functionScoreQuery = new FunctionScoreQuery(new MatchAllQuery());
+$existsFilter = new ExistsFilter('price');
+$functionScoreQuery->addFieldValueFactorFunction('price', 0.5, 'ln', $existsFilter);
+
+$search = new Search();
+$search->addQuery($functionScoreQuery);
+
+$queryArray = $search->toArray();
+```
+
+Will result in 
+
+```JSON
+{
+  "query": {
+    "function_score": {
+      "query": {
+        "match_all": {}
+      },
+      "functions": [
+        {
+          "field_value_factor": {
+            "field": "price",
+            "factor": 0.5,
+            "modifier": "ln"
+          },
+          "filter": {
+            "exists": {
+              "field": "price"
+            }
+          }
+        }
+      ]
+    }
+  }
+}
+```
+
+## Random function example
+
+```php
+$functionScoreQuery = new FunctionScoreQuery(new MatchAllQuery());
+$functionScoreQuery->addRandomFunction();
+
+$search = new Search();
+$search->addQuery($functionScoreQuery);
+
+$queryArray = $search->toArray();
+```
+
+Will result in
+
+```JSON
+{
+  "query": {
+    "function_score": {
+      "query": {
+        "match_all": {}
+      },
+      "functions": [
+        {
+          "random_score": {}
+        }
+      ]
+    }
+  }
+}
+```
+
+[1]: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html