diff --git a/CHANGELOG.md b/CHANGELOG.md index 9eeb5b8..d071ac2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 4.0.3 [unreleased] + +- Added warnings for certain regular expressions +- Fixed anchored regular expressions + ## 4.0.2 - Added block form of `scroll` diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index 81007f2..7226312 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -985,7 +985,20 @@ module Searchkick elsif value.nil? {bool: {must_not: {exists: {field: field}}}} elsif value.is_a?(Regexp) - {regexp: {field => {value: value.source, flags: "NONE"}}} + if value.casefold? + warn "[searchkick] Case-insensitive flag does not work with Elasticsearch" + end + + source = value.source + unless source.start_with?("\\A") && source.end_with?("\\z") + # https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html + warn "[searchkick] Regular expressions are always anchored in Elasticsearch" + end + + # remove \A and \z + source = source.sub(/\\A/, "").sub(/\\z\z/, "") + + {regexp: {field => {value: source, flags: "NONE"}}} else {term: {field => value}} end diff --git a/test/where_test.rb b/test/where_test.rb index 4a157a4..ef196e1 100644 --- a/test/where_test.rb +++ b/test/where_test.rb @@ -78,7 +78,7 @@ class WhereTest < Minitest::Test def test_regexp store_names ["Product A"] - assert_search "*", ["Product A"], where: {name: /Pro.+/} + assert_search "*", ["Product A"], where: {name: /\APro.+\z/} end def test_alternate_regexp @@ -88,7 +88,22 @@ class WhereTest < Minitest::Test def test_special_regexp store_names ["Product ", "Item "] - assert_search "*", ["Product "], where: {name: /Pro.+<.+/} + assert_search "*", ["Product "], where: {name: /\APro.+<.+\z/} + end + + # regular expressions are always anchored in ES + def test_regexp_not_anchored + store_names ["abcde"] + assert_search "*", [], where: {name: /abcd/} + assert_search "*", ["abcde"], where: {name: /abcde/} + assert_search "*", ["abcde"], where: {name: /\Aabcde\z/} + end + + def test_regexp_case + store_names ["abcde"] + assert_search "*", [], where: {name: /\AABCDE\z/} + # flags don't work + assert_search "*", [], where: {name: /\AABCDE\z/i} end def test_prefix -- libgit2 0.21.0