2013-08-28 19:24:34 -04:00
|
|
|
[[search-suggesters-completion]]
|
|
|
|
=== Completion Suggester
|
|
|
|
|
|
|
|
NOTE: In order to understand the format of suggestions, please
|
|
|
|
read the <<search-suggesters>> page first.
|
|
|
|
|
2015-10-31 01:59:21 -04:00
|
|
|
The `completion` suggester provides auto-complete/search-as-you-type
|
|
|
|
functionality. This is a navigational feature to guide users to
|
|
|
|
relevant results as they are typing, improving search precision.
|
|
|
|
It is not meant for spell correction or did-you-mean functionality
|
|
|
|
like the `term` or `phrase` suggesters.
|
|
|
|
|
|
|
|
Ideally, auto-complete functionality should be as fast as a user
|
|
|
|
types to provide instant feedback relevant to what a user has already
|
|
|
|
typed in. Hence, `completion` suggester is optimized for speed.
|
|
|
|
The suggester uses data structures that enable fast lookups,
|
|
|
|
but are costly to build and are stored in-memory.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2013-09-30 17:32:00 -04:00
|
|
|
[[completion-suggester-mapping]]
|
2013-08-28 19:24:34 -04:00
|
|
|
==== Mapping
|
|
|
|
|
2015-10-31 01:59:21 -04:00
|
|
|
To use this feature, specify a special mapping for this field,
|
|
|
|
which indexes the field values for fast completions.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
PUT music
|
2015-10-31 01:59:21 -04:00
|
|
|
{
|
2016-08-03 18:40:17 -04:00
|
|
|
"mappings": {
|
|
|
|
"song" : {
|
|
|
|
"properties" : {
|
|
|
|
"suggest" : {
|
|
|
|
"type" : "completion"
|
|
|
|
},
|
|
|
|
"title" : {
|
|
|
|
"type": "keyword"
|
|
|
|
}
|
2013-08-28 19:24:34 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-10-31 01:59:21 -04:00
|
|
|
}
|
2013-08-28 19:24:34 -04:00
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
// CONSOLE
|
|
|
|
// TESTSETUP
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
Mapping supports the following parameters:
|
|
|
|
|
2015-01-20 21:15:02 -05:00
|
|
|
`analyzer`::
|
2013-08-28 19:24:34 -04:00
|
|
|
The index analyzer to use, defaults to `simple`.
|
|
|
|
In case you are wondering why we did not opt for the `standard`
|
|
|
|
analyzer: We try to have easy to understand behaviour here, and if you
|
|
|
|
index the field content `At the Drive-in`, you will not get any
|
|
|
|
suggestions for `a`, nor for `d` (the first non stopword).
|
|
|
|
|
2015-01-20 21:15:02 -05:00
|
|
|
`search_analyzer`::
|
|
|
|
The search analyzer to use, defaults to value of `analyzer`.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2013-09-02 09:55:47 -04:00
|
|
|
`preserve_separators`::
|
2013-08-28 19:24:34 -04:00
|
|
|
Preserves the separators, defaults to `true`.
|
|
|
|
If disabled, you could find a field starting with `Foo Fighters`, if you
|
|
|
|
suggest for `foof`.
|
|
|
|
|
2013-09-04 14:40:36 -04:00
|
|
|
`preserve_position_increments`::
|
2015-10-31 01:59:21 -04:00
|
|
|
Enables position increments, defaults to `true`.
|
|
|
|
If disabled and using stopwords analyzer, you could get a
|
2013-08-28 19:24:34 -04:00
|
|
|
field starting with `The Beatles`, if you suggest for `b`. *Note*: You
|
|
|
|
could also achieve this by indexing two inputs, `Beatles` and
|
|
|
|
`The Beatles`, no need to change a simple analyzer, if you are able to
|
|
|
|
enrich your data.
|
|
|
|
|
2014-01-02 11:11:20 -05:00
|
|
|
`max_input_length`::
|
2013-09-02 09:55:47 -04:00
|
|
|
Limits the length of a single input, defaults to `50` UTF-16 code points.
|
|
|
|
This limit is only used at index time to reduce the total number of
|
|
|
|
characters per input string in order to prevent massive inputs from
|
2015-10-31 01:59:21 -04:00
|
|
|
bloating the underlying datastructure. Most usecases won't be influenced
|
|
|
|
by the default value since prefix completions seldom grow beyond prefixes longer
|
|
|
|
than a handful of characters.
|
2013-09-04 14:40:36 -04:00
|
|
|
|
2013-09-25 12:17:40 -04:00
|
|
|
[[indexing]]
|
2013-08-28 19:24:34 -04:00
|
|
|
==== Indexing
|
|
|
|
|
2015-10-31 01:59:21 -04:00
|
|
|
You index suggestions like any other field. A suggestion is made of an
|
|
|
|
`input` and an optional `weight` attribute. An `input` is the expected
|
|
|
|
text to be matched by a suggestion query and the `weight` determines how
|
|
|
|
the suggestions will be scored. Indexing a suggestion is as follows:
|
|
|
|
|
2013-08-28 19:24:34 -04:00
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
PUT music/song/1?refresh
|
2015-10-31 01:59:21 -04:00
|
|
|
{
|
2013-09-04 14:40:36 -04:00
|
|
|
"suggest" : {
|
2013-08-28 19:24:34 -04:00
|
|
|
"input": [ "Nevermind", "Nirvana" ],
|
|
|
|
"weight" : 34
|
|
|
|
}
|
2015-10-31 01:59:21 -04:00
|
|
|
}
|
2013-08-28 19:24:34 -04:00
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
// CONSOLE
|
|
|
|
// TEST
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
The following parameters are supported:
|
|
|
|
|
2013-09-04 14:40:36 -04:00
|
|
|
`input`::
|
2015-12-11 08:38:13 -05:00
|
|
|
The input to store, this can be an array of strings or just
|
2013-08-28 19:24:34 -04:00
|
|
|
a string. This field is mandatory.
|
|
|
|
|
2013-09-04 14:40:36 -04:00
|
|
|
`weight`::
|
2014-10-22 13:44:33 -04:00
|
|
|
A positive integer or a string containing a positive integer,
|
|
|
|
which defines a weight and allows you to rank your suggestions.
|
|
|
|
This field is optional.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2015-10-31 01:59:21 -04:00
|
|
|
You can index multiple suggestions for a document as follows:
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
PUT music/song/1?refresh
|
2013-08-28 19:24:34 -04:00
|
|
|
{
|
2015-10-31 01:59:21 -04:00
|
|
|
"suggest" : [
|
|
|
|
{
|
|
|
|
"input": "Nevermind",
|
|
|
|
"weight" : 10
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"input": "Nirvana",
|
|
|
|
"weight" : 3
|
|
|
|
}
|
|
|
|
]
|
2013-08-28 19:24:34 -04:00
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
// CONSOLE
|
|
|
|
// TEST[continued]
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2015-10-31 01:59:21 -04:00
|
|
|
You can use the following shorthand form. Note that you can not specify
|
|
|
|
a weight with suggestion(s).
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
PUT music/song/1?refresh
|
2015-10-31 01:59:21 -04:00
|
|
|
{
|
|
|
|
"suggest" : [ "Nevermind", "Nirvana" ]
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
// CONSOLE
|
|
|
|
// TEST[continued]
|
2013-11-28 04:27:31 -05:00
|
|
|
|
2013-09-25 12:17:40 -04:00
|
|
|
[[querying]]
|
2013-08-28 19:24:34 -04:00
|
|
|
==== Querying
|
|
|
|
|
|
|
|
Suggesting works as usual, except that you have to specify the suggest
|
2015-10-31 01:59:21 -04:00
|
|
|
type as `completion`. Suggestions are near real-time, which means
|
|
|
|
new suggestions can be made visible by <<indices-refresh,refresh>> and
|
2016-08-03 18:40:17 -04:00
|
|
|
documents once deleted are never shown. This request:
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2015-10-31 01:59:21 -04:00
|
|
|
POST music/_suggest?pretty
|
|
|
|
{
|
2013-08-28 19:24:34 -04:00
|
|
|
"song-suggest" : {
|
2016-08-03 18:40:17 -04:00
|
|
|
"prefix" : "nir",
|
2013-08-28 19:24:34 -04:00
|
|
|
"completion" : {
|
|
|
|
"field" : "suggest"
|
|
|
|
}
|
|
|
|
}
|
2015-10-31 01:59:21 -04:00
|
|
|
}
|
2016-08-03 18:40:17 -04:00
|
|
|
--------------------------------------------------
|
|
|
|
// CONSOLE
|
|
|
|
// TEST[continued]
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2016-08-03 18:40:17 -04:00
|
|
|
returns this response:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2013-08-28 19:24:34 -04:00
|
|
|
{
|
|
|
|
"_shards" : {
|
|
|
|
"total" : 5,
|
|
|
|
"successful" : 5,
|
|
|
|
"failed" : 0
|
|
|
|
},
|
|
|
|
"song-suggest" : [ {
|
2016-08-03 18:40:17 -04:00
|
|
|
"text" : "nir",
|
2013-08-28 19:24:34 -04:00
|
|
|
"offset" : 0,
|
2016-08-03 18:40:17 -04:00
|
|
|
"length" : 3,
|
2013-08-28 19:24:34 -04:00
|
|
|
"options" : [ {
|
2015-10-31 01:59:21 -04:00
|
|
|
"text" : "Nirvana",
|
2016-08-05 17:49:56 -04:00
|
|
|
"_index": "music",
|
|
|
|
"_type": "song",
|
|
|
|
"_id": "1",
|
|
|
|
"_score": 1.0,
|
|
|
|
"_source": {
|
|
|
|
"suggest": ["Nevermind", "Nirvana"]
|
|
|
|
}
|
2013-08-28 19:24:34 -04:00
|
|
|
} ]
|
|
|
|
} ]
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
// TESTRESPONSE
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2016-08-05 17:49:56 -04:00
|
|
|
The configured weight for a suggestion is returned as `_score`.
|
2016-08-08 14:56:28 -04:00
|
|
|
The `text` field uses the `input` of your indexed suggestion.
|
|
|
|
Suggestions are document oriented, the document source is
|
|
|
|
returned in `_source`. <<search-request-source-filtering, source filtering>>
|
2016-08-05 17:49:56 -04:00
|
|
|
parameters are supported for filtering the document source.
|
2015-10-31 01:59:21 -04:00
|
|
|
|
|
|
|
The basic completion suggester query supports the following parameters:
|
2014-10-14 12:46:57 -04:00
|
|
|
|
|
|
|
`field`:: The name of the field on which to run the query (required).
|
|
|
|
`size`:: The number of suggestions to return (defaults to `5`).
|
2015-10-31 01:59:21 -04:00
|
|
|
`payload`:: The name of the field or field name array to be returned
|
|
|
|
as payload (defaults to no fields).
|
2014-10-14 12:46:57 -04:00
|
|
|
|
2013-10-08 07:55:25 -04:00
|
|
|
NOTE: The completion suggester considers all documents in the index.
|
|
|
|
See <<suggester-context>> for an explanation of how to query a subset of
|
|
|
|
documents instead.
|
2013-09-04 14:40:36 -04:00
|
|
|
|
2015-10-31 01:59:21 -04:00
|
|
|
NOTE: Specifying `payload` fields will incur additional search performance
|
|
|
|
hit. The `payload` fields are retrieved eagerly (single pass) for top
|
|
|
|
suggestions at the shard level using field data or from doc values.
|
|
|
|
|
2013-09-25 12:17:40 -04:00
|
|
|
[[fuzzy]]
|
2013-09-04 14:40:36 -04:00
|
|
|
==== Fuzzy queries
|
|
|
|
|
|
|
|
The completion suggester also supports fuzzy queries - this means,
|
2015-10-31 01:59:21 -04:00
|
|
|
you can have a typo in your search and still get results back.
|
2013-09-04 14:40:36 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2015-10-31 01:59:21 -04:00
|
|
|
POST music/_suggest?pretty
|
|
|
|
{
|
2013-09-04 14:40:36 -04:00
|
|
|
"song-suggest" : {
|
2016-08-03 18:40:17 -04:00
|
|
|
"prefix" : "nor",
|
2013-09-04 14:40:36 -04:00
|
|
|
"completion" : {
|
|
|
|
"field" : "suggest",
|
|
|
|
"fuzzy" : {
|
2014-01-02 10:45:24 -05:00
|
|
|
"fuzziness" : 2
|
2013-09-04 14:40:36 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-10-31 01:59:21 -04:00
|
|
|
}
|
2013-09-04 14:40:36 -04:00
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
// CONSOLE
|
2013-09-04 14:40:36 -04:00
|
|
|
|
2015-10-31 01:59:21 -04:00
|
|
|
Suggestions that share the longest prefix to the query `prefix` will
|
|
|
|
be scored higher.
|
|
|
|
|
2013-09-04 14:40:36 -04:00
|
|
|
The fuzzy query can take specific fuzzy parameters.
|
|
|
|
The following parameters are supported:
|
|
|
|
|
|
|
|
[horizontal]
|
2014-01-02 10:45:24 -05:00
|
|
|
`fuzziness`::
|
|
|
|
The fuzziness factor, defaults to `AUTO`.
|
|
|
|
See <<fuzziness>> for allowed settings.
|
2013-09-04 14:40:36 -04:00
|
|
|
|
|
|
|
`transpositions`::
|
2015-07-14 22:37:44 -04:00
|
|
|
if set to `true`, transpositions are counted
|
|
|
|
as one change instead of two, defaults to `true`
|
2013-09-04 14:40:36 -04:00
|
|
|
|
|
|
|
`min_length`::
|
|
|
|
Minimum length of the input before fuzzy
|
|
|
|
suggestions are returned, defaults `3`
|
|
|
|
|
|
|
|
`prefix_length`::
|
|
|
|
Minimum length of the input, which is not
|
|
|
|
checked for fuzzy alternatives, defaults to `1`
|
|
|
|
|
2013-11-25 12:22:34 -05:00
|
|
|
`unicode_aware`::
|
2015-10-31 01:59:21 -04:00
|
|
|
If `true`, all measurements (like fuzzy edit
|
|
|
|
distance, transpositions, and lengths) are
|
|
|
|
measured in Unicode code points instead of
|
|
|
|
in bytes. This is slightly slower than raw
|
|
|
|
bytes, so it is set to `false` by default.
|
2013-11-25 12:22:34 -05:00
|
|
|
|
2013-09-04 14:40:36 -04:00
|
|
|
NOTE: If you want to stick with the default values, but
|
|
|
|
still use fuzzy, you can either use `fuzzy: {}`
|
|
|
|
or `fuzzy: true`.
|
2015-10-31 01:59:21 -04:00
|
|
|
|
|
|
|
[[regex]]
|
|
|
|
==== Regex queries
|
|
|
|
|
|
|
|
The completion suggester also supports regex queries meaning
|
|
|
|
you can express a prefix as a regular expression
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
POST music/_suggest?pretty
|
|
|
|
{
|
|
|
|
"song-suggest" : {
|
|
|
|
"regex" : "n[ever|i]r",
|
|
|
|
"completion" : {
|
2016-08-03 18:40:17 -04:00
|
|
|
"field" : "suggest"
|
2015-10-31 01:59:21 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2016-08-03 18:40:17 -04:00
|
|
|
// CONSOLE
|
2015-10-31 01:59:21 -04:00
|
|
|
|
|
|
|
The regex query can take specific regex parameters.
|
|
|
|
The following parameters are supported:
|
|
|
|
|
|
|
|
[horizontal]
|
|
|
|
`flags`::
|
|
|
|
Possible flags are `ALL` (default), `ANYSTRING`, `COMPLEMENT`,
|
|
|
|
`EMPTY`, `INTERSECTION`, `INTERVAL`, or `NONE`. See <<query-dsl-regexp-query, regexp-syntax>>
|
|
|
|
for their meaning
|
|
|
|
|
|
|
|
`max_determinized_states`::
|
|
|
|
Regular expressions are dangerous because it's easy to accidentally
|
|
|
|
create an innocuous looking one that requires an exponential number of
|
|
|
|
internal determinized automaton states (and corresponding RAM and CPU)
|
|
|
|
for Lucene to execute. Lucene prevents these using the
|
|
|
|
`max_determinized_states` setting (defaults to 10000). You can raise
|
|
|
|
this limit to allow more complex regular expressions to execute.
|