Skip to content

Commit

Permalink
Support case sensitivity in most term-level queries
Browse files Browse the repository at this point in the history
Elasticsearch 7.10 added a case-sensitivity option to most term-level
queries.

Close #1496
  • Loading branch information
olivere committed Jun 16, 2021
1 parent ff8340b commit fb742c1
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 18 deletions.
19 changes: 14 additions & 5 deletions search_queries_prefix.go
Expand Up @@ -10,11 +10,12 @@ package elastic
// For more details, see
// https://www.elastic.co/guide/en/elasticsearch/reference/7.0/query-dsl-prefix-query.html
type PrefixQuery struct {
name string
prefix string
boost *float64
rewrite string
queryName string
name string
prefix string
boost *float64
rewrite string
caseInsensitive *bool
queryName string
}

// NewPrefixQuery creates and initializes a new PrefixQuery.
Expand All @@ -33,6 +34,11 @@ func (q *PrefixQuery) Rewrite(rewrite string) *PrefixQuery {
return q
}

func (q *PrefixQuery) CaseInsensitive(caseInsensitive bool) *PrefixQuery {
q.caseInsensitive = &caseInsensitive
return q
}

// QueryName sets the query name for the filter that can be used when
// searching for matched_filters per hit.
func (q *PrefixQuery) QueryName(queryName string) *PrefixQuery {
Expand All @@ -57,6 +63,9 @@ func (q *PrefixQuery) Source() (interface{}, error) {
if q.rewrite != "" {
subQuery["rewrite"] = q.rewrite
}
if q.caseInsensitive != nil {
subQuery["case_insensitive"] = *q.caseInsensitive
}
if q.queryName != "" {
subQuery["_name"] = q.queryName
}
Expand Down
4 changes: 2 additions & 2 deletions search_queries_prefix_test.go
Expand Up @@ -27,7 +27,7 @@ func TestPrefixQuery(t *testing.T) {
}

func TestPrefixQueryWithOptions(t *testing.T) {
q := NewPrefixQuery("user", "ki")
q := NewPrefixQuery("user", "ki").CaseInsensitive(true)
q = q.QueryName("my_query_name")
src, err := q.Source()
if err != nil {
Expand All @@ -38,7 +38,7 @@ func TestPrefixQueryWithOptions(t *testing.T) {
t.Fatalf("marshaling to JSON failed: %v", err)
}
got := string(data)
expected := `{"prefix":{"user":{"_name":"my_query_name","value":"ki"}}}`
expected := `{"prefix":{"user":{"_name":"my_query_name","case_insensitive":true,"value":"ki"}}}`
if got != expected {
t.Errorf("expected\n%s\n,got:\n%s", expected, got)
}
Expand Down
9 changes: 9 additions & 0 deletions search_queries_regexp.go
Expand Up @@ -14,6 +14,7 @@ type RegexpQuery struct {
flags string
boost *float64
rewrite string
caseInsensitive *bool
queryName string
maxDeterminizedStates *int
}
Expand Down Expand Up @@ -46,6 +47,11 @@ func (q *RegexpQuery) Rewrite(rewrite string) *RegexpQuery {
return q
}

func (q *RegexpQuery) CaseInsensitive(caseInsensitive bool) *RegexpQuery {
q.caseInsensitive = &caseInsensitive
return q
}

// QueryName sets the query name for the filter that can be used
// when searching for matched_filters per hit
func (q *RegexpQuery) QueryName(queryName string) *RegexpQuery {
Expand Down Expand Up @@ -73,6 +79,9 @@ func (q *RegexpQuery) Source() (interface{}, error) {
if q.rewrite != "" {
x["rewrite"] = q.rewrite
}
if q.caseInsensitive != nil {
x["case_insensitive"] = *q.caseInsensitive
}
if q.queryName != "" {
x["name"] = q.queryName
}
Expand Down
3 changes: 2 additions & 1 deletion search_queries_regexp_test.go
Expand Up @@ -30,6 +30,7 @@ func TestRegexpQueryWithOptions(t *testing.T) {
q := NewRegexpQuery("name.first", "s.*y").
Boost(1.2).
Flags("INTERSECTION|COMPLEMENT|EMPTY").
CaseInsensitive(true).
QueryName("my_query_name")
src, err := q.Source()
if err != nil {
Expand All @@ -40,7 +41,7 @@ func TestRegexpQueryWithOptions(t *testing.T) {
t.Fatalf("marshaling to JSON failed: %v", err)
}
got := string(data)
expected := `{"regexp":{"name.first":{"boost":1.2,"flags":"INTERSECTION|COMPLEMENT|EMPTY","name":"my_query_name","value":"s.*y"}}}`
expected := `{"regexp":{"name.first":{"boost":1.2,"case_insensitive":true,"flags":"INTERSECTION|COMPLEMENT|EMPTY","name":"my_query_name","value":"s.*y"}}}`
if got != expected {
t.Errorf("expected\n%s\n,got:\n%s", expected, got)
}
Expand Down
19 changes: 14 additions & 5 deletions search_queries_term.go
Expand Up @@ -10,10 +10,11 @@ package elastic
// For details, see
// https://www.elastic.co/guide/en/elasticsearch/reference/7.0/query-dsl-term-query.html
type TermQuery struct {
name string
value interface{}
boost *float64
queryName string
name string
value interface{}
boost *float64
caseInsensitive *bool
queryName string
}

// NewTermQuery creates and initializes a new TermQuery.
Expand All @@ -27,6 +28,11 @@ func (q *TermQuery) Boost(boost float64) *TermQuery {
return q
}

func (q *TermQuery) CaseInsensitive(caseInsensitive bool) *TermQuery {
q.caseInsensitive = &caseInsensitive
return q
}

// QueryName sets the query name for the filter that can be used
// when searching for matched_filters per hit
func (q *TermQuery) QueryName(queryName string) *TermQuery {
Expand All @@ -41,14 +47,17 @@ func (q *TermQuery) Source() (interface{}, error) {
tq := make(map[string]interface{})
source["term"] = tq

if q.boost == nil && q.queryName == "" {
if q.boost == nil && q.caseInsensitive == nil && q.queryName == "" {
tq[q.name] = q.value
} else {
subQ := make(map[string]interface{})
subQ["value"] = q.value
if q.boost != nil {
subQ["boost"] = *q.boost
}
if q.caseInsensitive != nil {
subQ["case_insensitive"] = *q.caseInsensitive
}
if q.queryName != "" {
subQ["_name"] = q.queryName
}
Expand Down
3 changes: 2 additions & 1 deletion search_queries_term_test.go
Expand Up @@ -30,6 +30,7 @@ func TestTermQueryWithOptions(t *testing.T) {
q := NewTermQuery("user", "ki")
q = q.Boost(2.79)
q = q.QueryName("my_tq")
q = q.CaseInsensitive(true)
src, err := q.Source()
if err != nil {
t.Fatal(err)
Expand All @@ -39,7 +40,7 @@ func TestTermQueryWithOptions(t *testing.T) {
t.Fatalf("marshaling to JSON failed: %v", err)
}
got := string(data)
expected := `{"term":{"user":{"_name":"my_tq","boost":2.79,"value":"ki"}}}`
expected := `{"term":{"user":{"_name":"my_tq","boost":2.79,"case_insensitive":true,"value":"ki"}}}`
if got != expected {
t.Errorf("expected\n%s\n,got:\n%s", expected, got)
}
Expand Down
8 changes: 4 additions & 4 deletions search_queries_wildcard.go
Expand Up @@ -20,7 +20,7 @@ type WildcardQuery struct {
boost *float64
rewrite string
queryName string
caseInsensitive bool
caseInsensitive *bool
}

// NewWildcardQuery creates and initializes a new WildcardQuery.
Expand Down Expand Up @@ -50,7 +50,7 @@ func (q *WildcardQuery) QueryName(queryName string) *WildcardQuery {

// CaseInsensitive sets case insensitive matching of this query.
func (q *WildcardQuery) CaseInsensitive(caseInsensitive bool) *WildcardQuery {
q.caseInsensitive = caseInsensitive
q.caseInsensitive = &caseInsensitive
return q
}

Expand Down Expand Up @@ -84,8 +84,8 @@ func (q *WildcardQuery) Source() (interface{}, error) {
if q.queryName != "" {
wq["_name"] = q.queryName
}
if q.caseInsensitive {
wq["case_insensitive"] = true
if q.caseInsensitive != nil {
wq["case_insensitive"] = *q.caseInsensitive
}

return source, nil
Expand Down

0 comments on commit fb742c1

Please sign in to comment.