123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- // Copyright 2012-present Oliver Eilhard. All rights reserved.
- // Use of this source code is governed by a MIT-license.
- // See http://olivere.mit-license.org/license.txt for details.
- package elastic
- // FuzzyQuery uses similarity based on Levenshtein edit distance for
- // string fields, and a +/- margin on numeric and date fields.
- //
- // For more details, see
- // https://www.elastic.co/guide/en/elasticsearch/reference/5.2/query-dsl-fuzzy-query.html
- type FuzzyQuery struct {
- name string
- value interface{}
- boost *float64
- fuzziness interface{}
- prefixLength *int
- maxExpansions *int
- transpositions *bool
- rewrite string
- queryName string
- }
- // NewFuzzyQuery creates a new fuzzy query.
- func NewFuzzyQuery(name string, value interface{}) *FuzzyQuery {
- q := &FuzzyQuery{
- name: name,
- value: value,
- }
- return q
- }
- // Boost sets the boost for this query. Documents matching this query will
- // (in addition to the normal weightings) have their score multiplied by
- // the boost provided.
- func (q *FuzzyQuery) Boost(boost float64) *FuzzyQuery {
- q.boost = &boost
- return q
- }
- // Fuzziness can be an integer/long like 0, 1 or 2 as well as strings
- // like "auto", "0..1", "1..4" or "0.0..1.0".
- func (q *FuzzyQuery) Fuzziness(fuzziness interface{}) *FuzzyQuery {
- q.fuzziness = fuzziness
- return q
- }
- func (q *FuzzyQuery) PrefixLength(prefixLength int) *FuzzyQuery {
- q.prefixLength = &prefixLength
- return q
- }
- func (q *FuzzyQuery) MaxExpansions(maxExpansions int) *FuzzyQuery {
- q.maxExpansions = &maxExpansions
- return q
- }
- func (q *FuzzyQuery) Transpositions(transpositions bool) *FuzzyQuery {
- q.transpositions = &transpositions
- return q
- }
- func (q *FuzzyQuery) Rewrite(rewrite string) *FuzzyQuery {
- q.rewrite = rewrite
- return q
- }
- // QueryName sets the query name for the filter that can be used when
- // searching for matched filters per hit.
- func (q *FuzzyQuery) QueryName(queryName string) *FuzzyQuery {
- q.queryName = queryName
- return q
- }
- // Source returns JSON for the function score query.
- func (q *FuzzyQuery) Source() (interface{}, error) {
- // {
- // "fuzzy" : {
- // "user" : {
- // "value" : "ki",
- // "boost" : 1.0,
- // "fuzziness" : 2,
- // "prefix_length" : 0,
- // "max_expansions" : 100
- // }
- // }
- source := make(map[string]interface{})
- query := make(map[string]interface{})
- source["fuzzy"] = query
- fq := make(map[string]interface{})
- query[q.name] = fq
- fq["value"] = q.value
- if q.boost != nil {
- fq["boost"] = *q.boost
- }
- if q.transpositions != nil {
- fq["transpositions"] = *q.transpositions
- }
- if q.fuzziness != nil {
- fq["fuzziness"] = q.fuzziness
- }
- if q.prefixLength != nil {
- fq["prefix_length"] = *q.prefixLength
- }
- if q.maxExpansions != nil {
- fq["max_expansions"] = *q.maxExpansions
- }
- if q.rewrite != "" {
- fq["rewrite"] = q.rewrite
- }
- if q.queryName != "" {
- fq["_name"] = q.queryName
- }
- return source, nil
- }
|