qiita-elasticsearch 0.18.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
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