qiita-elasticsearch 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6cf12d1404cd16ad0ca66e662c930573cf6bead9
4
- data.tar.gz: cc701f849847a2c85140115a1a04d261dbc30009
3
+ metadata.gz: cfdec470b174315379e53ff2fe1108f8fc2caf05
4
+ data.tar.gz: 641ac30583600765c5659b355a53a8e59dc72235
5
5
  SHA512:
6
- metadata.gz: 79d36cd192a2efc54cd5a1d8b0ede53dc315c7d949f4a238cfa8ac55bc642e1589c413f607e3d4d9b4dcac43c8c92acfd20b391f088fb11255c563a1b0f27154
7
- data.tar.gz: adae64c88cdc0b142a63b16b27218ba891c60f935d18e53b34c6e74ac0bcaff86f4e16481893acb714090d455b20f07d6d1833f9c20af4374522ee8fba4ae175
6
+ metadata.gz: cbfbb70e49fcddc7d91b2b513bc784d15f7726570960d5d21300b268c1478031282a0afb460774ebcf0d2261f3683718325a246989321b3fb8ee69d8555a77ca
7
+ data.tar.gz: 00dea5c36f96a43fc7c6b2b98ea8c054439a1d3a4857fdb86e304bab38db6ad4d0f458a282624a14965779c43fabd53a40f9473722279357909263a5522245de
@@ -1,3 +1,7 @@
1
+ ## 0.19.0
2
+
3
+ * Introduce field alias mapping, which enables conversion of arbitrary field name in user query to Elasticsearch field names
4
+
1
5
  ## 0.18.0
2
6
 
3
7
  * Change the relative date expression format (Past date must be prefixed with `-` like `-30d`)
data/README.md CHANGED
@@ -102,3 +102,14 @@ query_builder = Qiita::Elasticsearch::QueryBuilder.new(downcased_fields: ["tag"]
102
102
  query_builder.build("tag:Ruby")
103
103
  #=> {"filtered"=>{"filter"=>{"term"=>{"tag"=>"ruby"}}}}
104
104
  ```
105
+
106
+ ### field_mapping
107
+ Pass `:field_mapping` option to search with aliases of field names.
108
+ Users can search with alias fields which could not exist in the mapping of Elasticsearch nodes.
109
+
110
+ ```rb
111
+ query_builder = Qiita::Elasticsearch::QueryBuilder.new(field_mapping: { "headline" => ["title", "title.ngram"]} )
112
+
113
+ query_builder.build("headline:Ruby")
114
+ #=> {"multi_match"=>{ "fields"=>["title", "title.ngram"], "query"=>"Ruby"}
115
+ ```
@@ -6,6 +6,7 @@ module Qiita
6
6
  RELATIVE_BEST_FIELDS_QUERY_WEIGHT = 0.5
7
7
 
8
8
  attr_writer :default_fields
9
+ attr_accessor :field_mapping
9
10
 
10
11
  # @return [Hash]
11
12
  def to_hash
@@ -27,6 +28,10 @@ module Qiita
27
28
 
28
29
  # @return [Hash]
29
30
  def build_multi_match_query(type: nil, boost: 1)
31
+ { "multi_match" => build_query(boost, type) }
32
+ end
33
+
34
+ def build_query(boost, type)
30
35
  query = {
31
36
  "boost" => boost,
32
37
  "fields" => matchable_fields,
@@ -34,18 +39,25 @@ module Qiita
34
39
  "type" => type,
35
40
  }
36
41
  query.merge!(options)
37
- { "multi_match" => query }
38
42
  end
39
43
 
40
44
  def matchable_fields
41
45
  if field_name
42
- [field_name]
46
+ target_fields
43
47
  elsif @default_fields && !@default_fields.empty?
44
48
  @default_fields
45
49
  else
46
50
  ["_all"]
47
51
  end
48
52
  end
53
+
54
+ def target_fields
55
+ @target_fields ||= field_aliases ? field_aliases : [field_name]
56
+ end
57
+
58
+ def field_aliases
59
+ field_mapping[field_name]
60
+ end
49
61
  end
50
62
  end
51
63
  end
@@ -12,10 +12,11 @@ module Qiita
12
12
  # @param [Array<String>, nil] hierarchal_fields
13
13
  # @param [Array<String>, nil] int_fields
14
14
  # @param [Array<String>, nil] default_fields
15
- # @param [Hash] matchable_options
16
15
  # @param [String, nil] time_zone
16
+ # @param [Hash, nil] matchable_options
17
+ # @param [Hash, nil] field_mapping for field aliasing
17
18
  def initialize(all_fields: nil, date_fields: nil, downcased_fields: nil, hierarchal_fields: nil,
18
- filterable_fields: nil, int_fields: nil, default_fields: nil, time_zone: nil, matchable_options: nil)
19
+ filterable_fields: nil, int_fields: nil, default_fields: nil, time_zone: nil, matchable_options: nil, field_mapping: nil)
19
20
  @all_fields = all_fields
20
21
  @date_fields = date_fields
21
22
  @downcased_fields = downcased_fields
@@ -25,6 +26,7 @@ module Qiita
25
26
  @default_fields = default_fields
26
27
  @time_zone = time_zone
27
28
  @matchable_options = matchable_options
29
+ @field_mapping = field_mapping
28
30
  end
29
31
 
30
32
  # @param [String] query_string Raw query string
@@ -54,6 +56,7 @@ module Qiita
54
56
  default_fields: @default_fields,
55
57
  time_zone: @time_zone,
56
58
  matchable_options: @matchable_options,
59
+ field_mapping: @field_mapping
57
60
  )
58
61
  end
59
62
  end
@@ -17,6 +17,7 @@ module Qiita
17
17
  EXTRA_DATE_FIELDS = %w(created updated)
18
18
  EXTRA_FILTERABLE_FIELDS = %w(created is sort updated)
19
19
  DEFAULT_MATCHABLE_OPTIONS = {}
20
+ DEFAULT_FIELD_MAPPING = {}
20
21
 
21
22
  TOKEN_PATTERN = /
22
23
  (?<token_string>
@@ -37,9 +38,10 @@ module Qiita
37
38
  # @param [Array<String>, nil] hierarchal_fields
38
39
  # @param [Array<String>, nil] int_fields
39
40
  # @param [Array<String>, nil] default_fields
40
- # @param [Hash] matchable_options Optional search parameters for MatchableToken
41
+ # @param [Hash, nil] matchable_options Optional search parameters for MatchableToken
42
+ # @param [Hash, nil] field_mapping alias of fields
41
43
  # @param [String, nil] time_zone
42
- def initialize(all_fields: nil, date_fields: nil, downcased_fields: nil, filterable_fields: nil, hierarchal_fields: nil, int_fields: nil, default_fields: nil, time_zone: nil, matchable_options: nil)
44
+ def initialize(all_fields: nil, date_fields: nil, downcased_fields: nil, filterable_fields: nil, hierarchal_fields: nil, int_fields: nil, default_fields: nil, time_zone: nil, matchable_options: nil, field_mapping: nil)
43
45
  @date_fields = (date_fields || DEFAULT_DATE_FIELDS) | EXTRA_DATE_FIELDS
44
46
  @downcased_fields = downcased_fields || DEFAULT_DOWNCASED_FIELDS
45
47
  @filterable_fields = (filterable_fields || DEFAULT_FILTERABLE_FIELDS) | EXTRA_FILTERABLE_FIELDS
@@ -47,6 +49,7 @@ module Qiita
47
49
  @int_fields = int_fields || DEFAULT_INT_FIELDS
48
50
  @default_fields = default_fields || DEFAULT_DEFAULT_FIELDS
49
51
  @matchable_options = matchable_options || DEFAULT_MATCHABLE_OPTIONS
52
+ @field_mapping = field_mapping || DEFAULT_FIELD_MAPPING
50
53
  @all_fields = aggregate_all_fields(all_fields)
51
54
  @time_zone = time_zone
52
55
  end
@@ -56,7 +59,7 @@ module Qiita
56
59
  def tokenize(query_string)
57
60
  query_string.scan(TOKEN_PATTERN).map do |token_string, minus, field_name, quoted_term, term|
58
61
  term ||= quoted_term
59
- if !field_name.nil? && !@all_fields.include?(field_name)
62
+ if !field_name.nil? && !@all_fields.include?(field_name) && !@field_mapping.key?(field_name)
60
63
  term = "#{field_name}:#{term}"
61
64
  field_name = nil
62
65
  end
@@ -71,6 +74,7 @@ module Qiita
71
74
  )
72
75
  token.options = @matchable_options if token.is_a?(MatchableToken)
73
76
  token.default_fields = @default_fields if token.is_a?(MatchableToken)
77
+ token.field_mapping = @field_mapping if token.is_a?(MatchableToken)
74
78
  token.time_zone = @time_zone if token.is_a?(DateToken)
75
79
  token
76
80
  end
@@ -1,5 +1,5 @@
1
1
  module Qiita
2
2
  module Elasticsearch
3
- VERSION = "0.18.0"
3
+ VERSION = "0.19.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qiita-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-12 00:00:00.000000000 Z
11
+ date: 2016-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport