2013-08-28 19:24:34 -04:00
|
|
|
[[query-dsl-mlt-query]]
|
|
|
|
=== More Like This Query
|
|
|
|
|
|
|
|
More like this query find documents that are "like" provided text by
|
|
|
|
running it against one or more fields.
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
|
|
|
"more_like_this" : {
|
|
|
|
"fields" : ["name.first", "name.last"],
|
|
|
|
"like_text" : "text like this one",
|
|
|
|
"min_term_freq" : 1,
|
|
|
|
"max_query_terms" : 12
|
|
|
|
}
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
|
|
|
|
2014-09-15 10:17:49 -04:00
|
|
|
More Like This can find documents that are "like" a set of
|
2014-04-17 11:09:20 -04:00
|
|
|
chosen documents. The syntax to specify one or more documents is similar to
|
|
|
|
the <<docs-multi-get,Multi GET API>>, and supports the `ids` or `docs` array.
|
2014-09-19 08:43:47 -04:00
|
|
|
If only one document is specified, the query behaves the same as the
|
2014-04-17 11:09:20 -04:00
|
|
|
<<search-more-like-this,More Like This API>>.
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
|
|
|
"more_like_this" : {
|
|
|
|
"fields" : ["name.first", "name.last"],
|
|
|
|
"docs" : [
|
|
|
|
{
|
|
|
|
"_index" : "test",
|
|
|
|
"_type" : "type",
|
|
|
|
"_id" : "1"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"_index" : "test",
|
|
|
|
"_type" : "type",
|
|
|
|
"_id" : "2"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"ids" : ["3", "4"],
|
|
|
|
"min_term_freq" : 1,
|
|
|
|
"max_query_terms" : 12
|
|
|
|
}
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
|
|
|
|
2014-09-15 10:17:49 -04:00
|
|
|
Additionally, the `doc` syntax of the
|
|
|
|
<<docs-multi-termvectors,Multi Term Vectors API>> is also supported. This is useful in
|
|
|
|
order to specify one or more documents not present in the index, and in
|
|
|
|
this case should be preferred over only using `like_text`.
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
|
|
|
"more_like_this" : {
|
|
|
|
"fields" : ["name.first", "name.last"],
|
|
|
|
"docs" : [
|
|
|
|
{
|
|
|
|
"_index" : "test",
|
|
|
|
"_type" : "type",
|
|
|
|
"doc" : {
|
|
|
|
"name": {
|
|
|
|
"first": "Ben",
|
|
|
|
"last": "Grimm"
|
|
|
|
},
|
|
|
|
"tweet": "You got no idea what I'd... what I'd give to be invisible."
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"_index" : "test",
|
|
|
|
"_type" : "type",
|
|
|
|
"_id" : "2"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"min_term_freq" : 1,
|
|
|
|
"max_query_terms" : 12
|
|
|
|
}
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
|
|
|
|
2013-08-28 19:24:34 -04:00
|
|
|
`more_like_this` can be shortened to `mlt`.
|
|
|
|
|
2014-05-08 06:21:18 -04:00
|
|
|
Under the hood, `more_like_this` simply creates multiple `should` clauses in a `bool` query of
|
|
|
|
interesting terms extracted from some provided text. The interesting terms are
|
|
|
|
selected with respect to their tf-idf scores. These are controlled by
|
|
|
|
`min_term_freq`, `min_doc_freq`, and `max_doc_freq`. The number of interesting
|
|
|
|
terms is controlled by `max_query_terms`. While the minimum number of clauses
|
|
|
|
that must be satisfied is controlled by `percent_terms_to_match`. The terms
|
|
|
|
are extracted from `like_text` which is analyzed by the analyzer associated
|
|
|
|
with the field, unless specified by `analyzer`. There are other parameters,
|
|
|
|
such as `min_word_length`, `max_word_length` or `stop_words`, to control what
|
|
|
|
terms should be considered as interesting. In order to give more weight to
|
|
|
|
more interesting terms, each boolean clause associated with a term could be
|
|
|
|
boosted by the term tf-idf score times some boosting factor `boost_terms`.
|
2014-04-17 11:09:20 -04:00
|
|
|
When a search for multiple `docs` is issued, More Like This generates a
|
|
|
|
`more_like_this` query per document field in `fields`. These `fields` are
|
|
|
|
specified as a top level parameter or within each `doc`.
|
|
|
|
|
2014-08-21 13:29:26 -04:00
|
|
|
IMPORTANT: The fields must be indexed and of type `string`. Additionally, when
|
|
|
|
using `ids` or `docs`, the fields must be either `stored`, store `term_vector`
|
|
|
|
or `_source` must be enabled.
|
|
|
|
|
2013-08-28 19:24:34 -04:00
|
|
|
The `more_like_this` top level parameters include:
|
|
|
|
|
|
|
|
[cols="<,<",options="header",]
|
|
|
|
|=======================================================================
|
|
|
|
|Parameter |Description
|
|
|
|
|`fields` |A list of the fields to run the more like this query against.
|
2014-08-21 13:29:26 -04:00
|
|
|
Defaults to the `_all` field for `like_text` and to all possible fields
|
|
|
|
for `ids` or `docs`.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2014-05-20 09:58:26 -04:00
|
|
|
|`like_text` |The text to find documents like it, *required* if `ids` or `docs` are
|
2014-04-17 11:09:20 -04:00
|
|
|
not specified.
|
|
|
|
|
2014-09-19 08:43:47 -04:00
|
|
|
|`ids` or `docs` |A list of documents following the same syntax as the
|
2014-09-15 10:17:49 -04:00
|
|
|
<<docs-multi-get,Multi GET API>> or <<docs-multi-termvectors,Multi Term Vectors API>>.
|
|
|
|
The text is fetched from `fields` unless specified otherwise in each `doc`.
|
2014-09-19 08:43:47 -04:00
|
|
|
The text is analyzed by the default analyzer at the field, unless specified by the
|
|
|
|
`per_field_analyzer` parameter of the <<docs-termvectors-per-field-analyzer,Term Vectors API>>.
|
2014-04-17 11:09:20 -04:00
|
|
|
|
2014-05-20 10:28:09 -04:00
|
|
|
|`include` |When using `ids` or `docs`, specifies whether the documents should be
|
|
|
|
included from the search. Defaults to `false`.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2014-09-26 10:30:43 -04:00
|
|
|
|`minimum_should_match`| From the generated query, the number of terms that
|
|
|
|
must match following the <<query-dsl-minimum-should-match,minimum should
|
|
|
|
syntax>>. (Defaults to `"30%"`).
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
|`min_term_freq` |The frequency below which terms will be ignored in the
|
|
|
|
source doc. The default frequency is `2`.
|
|
|
|
|
|
|
|
|`max_query_terms` |The maximum number of query terms that will be
|
|
|
|
included in any generated query. Defaults to `25`.
|
|
|
|
|
|
|
|
|`stop_words` |An array of stop words. Any word in this set is
|
|
|
|
considered "uninteresting" and ignored. Even if your Analyzer allows
|
|
|
|
stopwords, you might want to tell the MoreLikeThis code to ignore them,
|
|
|
|
as for the purposes of document similarity it seems reasonable to assume
|
|
|
|
that "a stop word is never interesting".
|
|
|
|
|
|
|
|
|`min_doc_freq` |The frequency at which words will be ignored which do
|
|
|
|
not occur in at least this many docs. Defaults to `5`.
|
|
|
|
|
|
|
|
|`max_doc_freq` |The maximum frequency in which words may still appear.
|
|
|
|
Words that appear in more than this many docs will be ignored. Defaults
|
|
|
|
to unbounded.
|
|
|
|
|
2014-01-02 11:11:20 -05:00
|
|
|
|`min_word_length` |The minimum word length below which words will be
|
|
|
|
ignored. Defaults to `0`.(Old name "min_word_len" is deprecated)
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2014-01-02 11:11:20 -05:00
|
|
|
|`max_word_length` |The maximum word length above which words will be
|
|
|
|
ignored. Defaults to unbounded (`0`). (Old name "max_word_len" is deprecated)
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
|`boost_terms` |Sets the boost factor to use when boosting terms.
|
2014-05-02 09:52:29 -04:00
|
|
|
Defaults to deactivated (`0`). Any other value activates boosting with given
|
|
|
|
boost factor.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
|`boost` |Sets the boost value of the query. Defaults to `1.0`.
|
|
|
|
|
2014-07-23 10:58:47 -04:00
|
|
|
|`analyzer` |The analyzer that will be used to analyze the `like text`.
|
|
|
|
Defaults to the analyzer associated with the first field in `fields`.
|
2013-08-28 19:24:34 -04:00
|
|
|
|=======================================================================
|
|
|
|
|