From 4df2224a7d1762ef238626a92c18af1076ca5f72 Mon Sep 17 00:00:00 2001 From: kunal Date: Wed, 20 Sep 2023 10:07:32 +0530 Subject: [PATCH] feat: prefix/match_phrase/boosting support --- .../dsl/search/queries/match.rb | 24 +++++++- .../dsl/search/queries/match_phrase.rb | 56 +++++++++++++++++++ .../dsl/search/queries/multi_match.rb | 17 +++++- .../dsl/search/queries/prefix.rb | 41 ++++++++++++++ .../dsl/search/queries/term.rb | 9 ++- 5 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 lib/elasticsearch_dsl_builder/dsl/search/queries/match_phrase.rb create mode 100644 lib/elasticsearch_dsl_builder/dsl/search/queries/prefix.rb diff --git a/lib/elasticsearch_dsl_builder/dsl/search/queries/match.rb b/lib/elasticsearch_dsl_builder/dsl/search/queries/match.rb index 478ad5d..60a8681 100644 --- a/lib/elasticsearch_dsl_builder/dsl/search/queries/match.rb +++ b/lib/elasticsearch_dsl_builder/dsl/search/queries/match.rb @@ -23,8 +23,30 @@ def value(value) self end + def operator(operator) + raise ArgumentError, 'operator must be a String' unless operator.instance_of?(String) + @operator = operator + self + end + + def boost(boost) + raise ArgumentError, 'boost must be a Integer' unless boost.instance_of?(Integer) + @boost = boost + self + end + + def fuzziness(fuzziness) + raise ArgumentError, 'fuzziness must be a Integer' unless fuzziness.instance_of?(Integer) + @fuzziness = fuzziness + self + end + def to_hash - @query = { @field => @value } + nested_query = { value: @value } + nested_query.update(operator: @operator) if @operator + nested_query.update(boost: @boost) if @boost + nested_query.update(fuzziness: @fuzziness) if @fuzziness + @query = { @field => nested_query } super end end diff --git a/lib/elasticsearch_dsl_builder/dsl/search/queries/match_phrase.rb b/lib/elasticsearch_dsl_builder/dsl/search/queries/match_phrase.rb new file mode 100644 index 0000000..0072e38 --- /dev/null +++ b/lib/elasticsearch_dsl_builder/dsl/search/queries/match_phrase.rb @@ -0,0 +1,56 @@ +module ElasticsearchDslBuilder + module DSL + module Search + module Queries + class MatchPhrase < Query + def initialize(field = nil, value = nil) + @type = :match_phrase + field(field) + value(value) + super() + end + + def field(field) + field_valid = field.instance_of?(String) || field.instance_of?(Symbol) + raise ArgumentError, 'field must be a String or Symbol' unless field_valid + @field = field.to_sym + self + end + + def value(value) + raise ArgumentError, 'value must be a String' unless value.instance_of?(String) + @value = value + self + end + + def operator(operator) + raise ArgumentError, 'operator must be a String' unless operator.instance_of?(String) + @operator = operator + self + end + + def boost(boost) + raise ArgumentError, 'boost must be a Integer' unless boost.instance_of?(Integer) + @boost = boost + self + end + + def fuzziness(fuzziness) + raise ArgumentError, 'fuzziness must be a Integer' unless fuzziness.instance_of?(Integer) + @fuzziness = fuzziness + self + end + + def to_hash + nested_query = { value: @value } + nested_query.update(operator: @operator) if @operator + nested_query.update(boost: @boost) if @boost + nested_query.update(fuzziness: @fuzziness) if @fuzziness + @query = { @field => nested_query } + super + end + end + end + end + end +end diff --git a/lib/elasticsearch_dsl_builder/dsl/search/queries/multi_match.rb b/lib/elasticsearch_dsl_builder/dsl/search/queries/multi_match.rb index 10c421b..cc4ca3c 100644 --- a/lib/elasticsearch_dsl_builder/dsl/search/queries/multi_match.rb +++ b/lib/elasticsearch_dsl_builder/dsl/search/queries/multi_match.rb @@ -24,8 +24,23 @@ def value(value) self end + def operator(operator) + raise ArgumentError, 'operator must be a String' unless operator.instance_of?(String) + @operator = operator + self + end + + def boost(boost) + raise ArgumentError, 'boost must be a Integer' unless boost.instance_of?(Integer) + @boost = boost + self + end + def to_hash - @query = { fields: @fields, query: @value } if @fields && @value + nested_query = { fields: @fields, query: @value } if @fields && @value + nested_query.update(operator: @operator) if @operator + nested_query.update(boost: @boost) if @boost + @query = nested_query super end end diff --git a/lib/elasticsearch_dsl_builder/dsl/search/queries/prefix.rb b/lib/elasticsearch_dsl_builder/dsl/search/queries/prefix.rb new file mode 100644 index 0000000..2923da2 --- /dev/null +++ b/lib/elasticsearch_dsl_builder/dsl/search/queries/prefix.rb @@ -0,0 +1,41 @@ +module ElasticsearchDslBuilder + module DSL + module Search + module Queries + class Prefix < Query + def initialize(field = nil, value = nil) + @type = :prefix + field(field) + value(value) + super() + end + + def field(field) + field_valid = field.instance_of?(String) || field.instance_of?(Symbol) + raise ArgumentError, 'field must be a String or Symbol' unless field_valid + @field = field.to_sym + self + end + + def value(value) + @value = value + self + end + + def boost(boost) + raise ArgumentError, 'boost must be a Integer' unless boost.instance_of?(Intger) + @boost = boost + self + end + + def to_hash + nested_query = { value: @value } + nested_query.update(boost: @boost) if @boost + @query = { @field => nested_query } + super + end + end + end + end + end +end diff --git a/lib/elasticsearch_dsl_builder/dsl/search/queries/term.rb b/lib/elasticsearch_dsl_builder/dsl/search/queries/term.rb index 9148bb3..5aa168d 100644 --- a/lib/elasticsearch_dsl_builder/dsl/search/queries/term.rb +++ b/lib/elasticsearch_dsl_builder/dsl/search/queries/term.rb @@ -22,9 +22,16 @@ def value(value) self end + def boost(boost) + @boost = boost + self + end + def to_hash raise InvalidQuery, 'field and value must be provided for Term Query' unless @field && @value - @query = { @field => @value } + nested_query = { value: @value } + nested_query.update(boost: @boost) if @boost + @query = { @field => nested_query } super end end