rsolr 1.0.8 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +21 -0
- data/CHANGES.txt +20 -1
- data/Gemfile +3 -9
- data/README.rdoc +34 -31
- data/Rakefile +1 -10
- data/lib/rsolr.rb +14 -10
- data/lib/rsolr/char.rb +4 -1
- data/lib/rsolr/client.rb +133 -54
- data/lib/rsolr/connection.rb +21 -17
- data/lib/rsolr/error.rb +39 -20
- data/lib/rsolr/response.rb +57 -13
- data/lib/rsolr/uri.rb +44 -27
- data/lib/rsolr/version.rb +7 -0
- data/lib/rsolr/xml.rb +69 -15
- data/rsolr.gemspec +14 -7
- data/spec/api/char_spec.rb +8 -3
- data/spec/api/client_spec.rb +221 -87
- data/spec/api/connection_spec.rb +93 -29
- data/spec/api/error_spec.rb +22 -32
- data/spec/api/pagination_spec.rb +12 -5
- data/spec/api/rsolr_spec.rb +28 -8
- data/spec/api/uri_spec.rb +108 -50
- data/spec/api/xml_spec.rb +196 -96
- data/spec/fixtures/basic_configs/_rest_managed.json +1 -0
- data/spec/fixtures/basic_configs/currency.xml +67 -0
- data/spec/fixtures/basic_configs/lang/stopwords_en.txt +54 -0
- data/spec/fixtures/basic_configs/protwords.txt +21 -0
- data/spec/fixtures/basic_configs/schema.xml +530 -0
- data/spec/fixtures/basic_configs/solrconfig.xml +572 -0
- data/spec/fixtures/basic_configs/stopwords.txt +14 -0
- data/spec/fixtures/basic_configs/synonyms.txt +29 -0
- data/spec/integration/solr5_spec.rb +26 -0
- data/spec/spec_helper.rb +8 -1
- data/tasks/spec.rake +1 -38
- metadata +98 -34
- data/tasks/rcov.rake +0 -25
data/spec/api/xml_spec.rb
CHANGED
@@ -1,121 +1,221 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'builder'
|
3
|
+
require 'nokogiri'
|
2
4
|
describe "RSolr::Xml" do
|
3
5
|
|
4
6
|
let(:generator){ RSolr::Xml::Generator.new }
|
7
|
+
|
8
|
+
builder_engines = {
|
9
|
+
:builder => { :val => false, :class => Builder::XmlMarkup, :engine => Builder::XmlMarkup.new(:indent => 0, :margin => 0, :encoding => 'UTF-8') },
|
10
|
+
:nokogiri => { :val => true, :class => Nokogiri::XML::Builder, :engine => Nokogiri::XML::Builder.new }
|
11
|
+
}
|
12
|
+
|
13
|
+
[:builder,:nokogiri].each do |engine_name|
|
14
|
+
describe engine_name do
|
15
|
+
before :all do
|
16
|
+
@engine = builder_engines[engine_name]
|
17
|
+
@old_ng_setting = RSolr::Xml::Generator.use_nokogiri
|
18
|
+
RSolr::Xml::Generator.use_nokogiri = @engine[:val]
|
19
|
+
end
|
20
|
+
|
21
|
+
after :all do
|
22
|
+
RSolr::Xml::Generator.use_nokogiri = @old_ng_setting
|
23
|
+
end
|
5
24
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
25
|
+
before :each do
|
26
|
+
builder_engines.each_pair do |name,spec|
|
27
|
+
expect(spec[:class]).not_to receive(:new) unless name == engine_name
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context :xml_engine do
|
32
|
+
it "should use #{engine_name}" do
|
33
|
+
expect(@engine[:class]).to receive(:new).and_return(@engine[:engine])
|
34
|
+
generator.send(:commit)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# call all of the simple methods...
|
39
|
+
# make sure the xml string is valid
|
40
|
+
# ensure the class is actually Solr::XML
|
41
|
+
[:optimize, :rollback, :commit].each do |meth|
|
42
|
+
it "#{meth} should generator xml" do
|
43
|
+
result = generator.send(meth)
|
44
|
+
expect(result).to eq("<?xml version=\"1.0\" encoding=\"UTF-8\"?><#{meth}/>")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context :add do
|
49
|
+
|
50
|
+
it 'should yield a Message::Document object when #add is called with a block' do
|
51
|
+
documents = [{:id=>1, :name=>'sam', :cat=>['cat 1', 'cat 2']}]
|
52
|
+
add_attrs = {:boost=>200.00}
|
53
|
+
result = generator.add(documents, add_attrs) do |doc|
|
54
|
+
doc.field_by_name(:name).attrs[:boost] = 10
|
55
|
+
expect(doc.fields.size).to eq(4)
|
56
|
+
expect(doc.fields_by_name(:cat).size).to eq(2)
|
57
|
+
end
|
58
|
+
expect(result).to match(%r(name="cat">cat 1</field>))
|
59
|
+
expect(result).to match(%r(name="cat">cat 2</field>))
|
60
|
+
expect(result).to match(%r(<add boost="200.0">))
|
61
|
+
expect(result).to match(%r(boost="10"))
|
62
|
+
expect(result).to match(%r(<field name="id">1</field>))
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should work for values that yield enumerators' do
|
66
|
+
documents = [{id: 1, cat: ['cat 1', 'cat 2'].to_enum}]
|
67
|
+
result = generator.add(documents)
|
68
|
+
|
69
|
+
expect(result).to match(%r(name="cat">cat 1</field>))
|
70
|
+
expect(result).to match(%r(name="cat">cat 2</field>))
|
71
|
+
end
|
72
|
+
|
73
|
+
# add a single hash ("doc")
|
74
|
+
it 'should create an add from a hash' do
|
75
|
+
data = {
|
76
|
+
:id=>1,
|
77
|
+
:name=>'matt'
|
78
|
+
}
|
79
|
+
result = generator.add(data)
|
80
|
+
expect(result).to match(/<field name="name">matt<\/field>/)
|
81
|
+
expect(result).to match(/<field name="id">1<\/field>/)
|
82
|
+
end
|
83
|
+
|
84
|
+
# add an array of hashes
|
85
|
+
it 'should create many adds from an array of hashes' do
|
86
|
+
data = [
|
87
|
+
{
|
88
|
+
:id=>1,
|
89
|
+
:name=>'matt'
|
90
|
+
},
|
91
|
+
{
|
92
|
+
:id=>2,
|
93
|
+
:name=>'sam'
|
94
|
+
}
|
95
|
+
]
|
96
|
+
message = generator.add(data)
|
97
|
+
expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><add><doc><field name=\"id\">1</field><field name=\"name\">matt</field></doc><doc><field name=\"id\">2</field><field name=\"name\">sam</field></doc></add>"
|
98
|
+
expect(message).to match(/<field name="name">matt<\/field>/)
|
99
|
+
expect(message).to match(/<field name="name">sam<\/field>/)
|
100
|
+
end
|
101
|
+
|
102
|
+
# multiValue field support test, thanks to Fouad Mardini!
|
103
|
+
it 'should create multiple fields from array values' do
|
104
|
+
data = {
|
105
|
+
:id => 1,
|
106
|
+
:name => ['matt1', 'matt2']
|
107
|
+
}
|
108
|
+
result = generator.add(data)
|
109
|
+
expect(result).to match(/<field name="name">matt1<\/field>/)
|
110
|
+
expect(result).to match(/<field name="name">matt2<\/field>/)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should allow for objects which can be casted to an array' do
|
114
|
+
name = double("name", to_ary: ['matt1', 'matt2'])
|
115
|
+
data = {
|
116
|
+
:id => 1,
|
117
|
+
:name => name
|
118
|
+
}
|
119
|
+
result = generator.add(data)
|
120
|
+
expect(result).to match(/<field name="name">matt1<\/field>/)
|
121
|
+
expect(result).to match(/<field name="name">matt2<\/field>/)
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should create an add from a single Message::Document' do
|
125
|
+
document = RSolr::Xml::Document.new
|
126
|
+
document.add_field('id', 1)
|
127
|
+
document.add_field('name', 'matt', :boost => 2.0)
|
128
|
+
result = generator.add(document)
|
129
|
+
expect(result).to match(Regexp.escape('<?xml version="1.0" encoding="UTF-8"?>'))
|
130
|
+
expect(result).to match(/<field name="id">1<\/field>/)
|
131
|
+
expect(result).to match Regexp.escape('boost="2.0"')
|
132
|
+
expect(result).to match Regexp.escape('name="name"')
|
133
|
+
expect(result).to match Regexp.escape('matt</field>')
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should create adds from multiple Message::Documents' do
|
137
|
+
documents = (1..2).map do |i|
|
138
|
+
doc = RSolr::Xml::Document.new
|
139
|
+
doc.add_field('id', i)
|
140
|
+
doc.add_field('name', "matt#{i}")
|
141
|
+
doc
|
142
|
+
end
|
143
|
+
result = generator.add(documents)
|
144
|
+
expect(result).to match(/<field name="name">matt1<\/field>/)
|
145
|
+
expect(result).to match(/<field name="name">matt2<\/field>/)
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
15
149
|
|
16
|
-
|
150
|
+
context :delete_by_id do
|
151
|
+
|
152
|
+
it 'should create a doc id delete' do
|
153
|
+
expect(generator.delete_by_id(10)).to eq("<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><id>10</id></delete>")
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'should create many doc id deletes' do
|
157
|
+
expect(generator.delete_by_id([1, 2, 3])).to eq("<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><id>1</id><id>2</id><id>3</id></delete>")
|
158
|
+
end
|
17
159
|
|
18
|
-
it 'should yield a Message::Document object when #add is called with a block' do
|
19
|
-
documents = [{:id=>1, :name=>'sam', :cat=>['cat 1', 'cat 2']}]
|
20
|
-
add_attrs = {:boost=>200.00}
|
21
|
-
result = generator.add(documents, add_attrs) do |doc|
|
22
|
-
doc.field_by_name(:name).attrs[:boost] = 10
|
23
|
-
doc.fields.size.should == 4
|
24
|
-
doc.fields_by_name(:cat).size.should == 2
|
25
160
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
161
|
+
|
162
|
+
context :delete_by_query do
|
163
|
+
it 'should create a query delete' do
|
164
|
+
expect(generator.delete_by_query('status:"LOST"')).to eq("<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><query>status:\"LOST\"</query></delete>")
|
165
|
+
end
|
32
166
|
|
33
|
-
|
34
|
-
|
167
|
+
it 'should create many query deletes' do
|
168
|
+
expect(generator.delete_by_query(['status:"LOST"', 'quantity:0'])).to eq("<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><query>status:\"LOST\"</query><query>quantity:0</query></delete>")
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
context :formatting do
|
176
|
+
it 'should format date objects into ISO 8601' do
|
35
177
|
data = {
|
36
|
-
:
|
37
|
-
:name=>'matt'
|
178
|
+
dt: Date.new(1992, 03, 15)
|
38
179
|
}
|
39
180
|
result = generator.add(data)
|
40
|
-
result.
|
41
|
-
result.should match(/<field name="id">1<\/field>/)
|
181
|
+
expect(result).to match(/<field name="dt">1992-03-15T00:00:00Z<\/field>/)
|
42
182
|
end
|
43
183
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
},
|
51
|
-
{
|
52
|
-
:id=>2,
|
53
|
-
:name=>'sam'
|
54
|
-
}
|
55
|
-
]
|
56
|
-
message = generator.add(data)
|
57
|
-
expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><add><doc><field name=\"id\">1</field><field name=\"name\">matt</field></doc><doc><field name=\"id\">2</field><field name=\"name\">sam</field></doc></add>"
|
58
|
-
message.should match(/<field name="name">matt<\/field>/)
|
59
|
-
message.should match(/<field name="name">sam<\/field>/)
|
184
|
+
it 'should format time objects into ISO 8601' do
|
185
|
+
data = {
|
186
|
+
dt: Time.new(1992, 03, 15, 16, 23, 55, 3600)
|
187
|
+
}
|
188
|
+
result = generator.add(data)
|
189
|
+
expect(result).to match(/<field name="dt">1992-03-15T15:23:55Z<\/field>/)
|
60
190
|
end
|
61
191
|
|
62
|
-
|
63
|
-
it 'should create multiple fields from array values' do
|
192
|
+
it 'should format datetime objects into ISO 8601' do
|
64
193
|
data = {
|
65
|
-
:
|
66
|
-
:name => ['matt1', 'matt2']
|
194
|
+
dt: DateTime.new(1992, 03, 15, 16, 23, 55, '+1')
|
67
195
|
}
|
68
196
|
result = generator.add(data)
|
69
|
-
result.
|
70
|
-
result.should match(/<field name="name">matt2<\/field>/)
|
197
|
+
expect(result).to match(/<field name="dt">1992-03-15T15:23:55Z<\/field>/)
|
71
198
|
end
|
72
199
|
|
73
|
-
it '
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
result
|
79
|
-
result.
|
80
|
-
result.should match Regexp.escape('boost="2.0"')
|
81
|
-
result.should match Regexp.escape('name="name"')
|
82
|
-
result.should match Regexp.escape('matt</field>')
|
200
|
+
it 'passes through other values' do
|
201
|
+
data = {
|
202
|
+
whatever: 'some string'
|
203
|
+
}
|
204
|
+
|
205
|
+
result = generator.add(data)
|
206
|
+
expect(result).to match(/<field name="whatever">some string<\/field>/)
|
83
207
|
end
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
208
|
+
|
209
|
+
# rails monkey-patches String to add a #to_time casting..
|
210
|
+
context 'with rails monkey patching' do
|
211
|
+
it 'passes through string values' do
|
212
|
+
data = {
|
213
|
+
whatever: double(to_s: 'some string', to_time: nil)
|
214
|
+
}
|
215
|
+
|
216
|
+
result = generator.add(data)
|
217
|
+
expect(result).to match(/<field name="whatever">some string<\/field>/)
|
91
218
|
end
|
92
|
-
result = generator.add(documents)
|
93
|
-
result.should match(/<field name="name">matt1<\/field>/)
|
94
|
-
result.should match(/<field name="name">matt2<\/field>/)
|
95
219
|
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
context :delete_by_id do
|
100
|
-
|
101
|
-
it 'should create a doc id delete' do
|
102
|
-
generator.delete_by_id(10).should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><id>10</id></delete>"
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'should create many doc id deletes' do
|
106
|
-
generator.delete_by_id([1, 2, 3]).should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><id>1</id><id>2</id><id>3</id></delete>"
|
107
|
-
end
|
108
|
-
|
109
220
|
end
|
110
|
-
|
111
|
-
context :delete_by_query do
|
112
|
-
it 'should create a query delete' do
|
113
|
-
generator.delete_by_query('status:"LOST"').should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><query>status:\"LOST\"</query></delete>"
|
114
|
-
end
|
115
|
-
|
116
|
-
it 'should create many query deletes' do
|
117
|
-
generator.delete_by_query(['status:"LOST"', 'quantity:0']).should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><query>status:\"LOST\"</query><query>quantity:0</query></delete>"
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
end
|
221
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"initArgs":{},"managedList":[]}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<?xml version="1.0" ?>
|
2
|
+
<!--
|
3
|
+
Licensed to the Apache Software Foundation (ASF) under one or more
|
4
|
+
contributor license agreements. See the NOTICE file distributed with
|
5
|
+
this work for additional information regarding copyright ownership.
|
6
|
+
The ASF licenses this file to You under the Apache License, Version 2.0
|
7
|
+
(the "License"); you may not use this file except in compliance with
|
8
|
+
the License. You may obtain a copy of the License at
|
9
|
+
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
See the License for the specific language governing permissions and
|
16
|
+
limitations under the License.
|
17
|
+
-->
|
18
|
+
|
19
|
+
<!-- Example exchange rates file for CurrencyField type named "currency" in example schema -->
|
20
|
+
|
21
|
+
<currencyConfig version="1.0">
|
22
|
+
<rates>
|
23
|
+
<!-- Updated from http://www.exchangerate.com/ at 2011-09-27 -->
|
24
|
+
<rate from="USD" to="ARS" rate="4.333871" comment="ARGENTINA Peso" />
|
25
|
+
<rate from="USD" to="AUD" rate="1.025768" comment="AUSTRALIA Dollar" />
|
26
|
+
<rate from="USD" to="EUR" rate="0.743676" comment="European Euro" />
|
27
|
+
<rate from="USD" to="BRL" rate="1.881093" comment="BRAZIL Real" />
|
28
|
+
<rate from="USD" to="CAD" rate="1.030815" comment="CANADA Dollar" />
|
29
|
+
<rate from="USD" to="CLP" rate="519.0996" comment="CHILE Peso" />
|
30
|
+
<rate from="USD" to="CNY" rate="6.387310" comment="CHINA Yuan" />
|
31
|
+
<rate from="USD" to="CZK" rate="18.47134" comment="CZECH REP. Koruna" />
|
32
|
+
<rate from="USD" to="DKK" rate="5.515436" comment="DENMARK Krone" />
|
33
|
+
<rate from="USD" to="HKD" rate="7.801922" comment="HONG KONG Dollar" />
|
34
|
+
<rate from="USD" to="HUF" rate="215.6169" comment="HUNGARY Forint" />
|
35
|
+
<rate from="USD" to="ISK" rate="118.1280" comment="ICELAND Krona" />
|
36
|
+
<rate from="USD" to="INR" rate="49.49088" comment="INDIA Rupee" />
|
37
|
+
<rate from="USD" to="XDR" rate="0.641358" comment="INTNL MON. FUND SDR" />
|
38
|
+
<rate from="USD" to="ILS" rate="3.709739" comment="ISRAEL Sheqel" />
|
39
|
+
<rate from="USD" to="JPY" rate="76.32419" comment="JAPAN Yen" />
|
40
|
+
<rate from="USD" to="KRW" rate="1169.173" comment="KOREA (SOUTH) Won" />
|
41
|
+
<rate from="USD" to="KWD" rate="0.275142" comment="KUWAIT Dinar" />
|
42
|
+
<rate from="USD" to="MXN" rate="13.85895" comment="MEXICO Peso" />
|
43
|
+
<rate from="USD" to="NZD" rate="1.285159" comment="NEW ZEALAND Dollar" />
|
44
|
+
<rate from="USD" to="NOK" rate="5.859035" comment="NORWAY Krone" />
|
45
|
+
<rate from="USD" to="PKR" rate="87.57007" comment="PAKISTAN Rupee" />
|
46
|
+
<rate from="USD" to="PEN" rate="2.730683" comment="PERU Sol" />
|
47
|
+
<rate from="USD" to="PHP" rate="43.62039" comment="PHILIPPINES Peso" />
|
48
|
+
<rate from="USD" to="PLN" rate="3.310139" comment="POLAND Zloty" />
|
49
|
+
<rate from="USD" to="RON" rate="3.100932" comment="ROMANIA Leu" />
|
50
|
+
<rate from="USD" to="RUB" rate="32.14663" comment="RUSSIA Ruble" />
|
51
|
+
<rate from="USD" to="SAR" rate="3.750465" comment="SAUDI ARABIA Riyal" />
|
52
|
+
<rate from="USD" to="SGD" rate="1.299352" comment="SINGAPORE Dollar" />
|
53
|
+
<rate from="USD" to="ZAR" rate="8.329761" comment="SOUTH AFRICA Rand" />
|
54
|
+
<rate from="USD" to="SEK" rate="6.883442" comment="SWEDEN Krona" />
|
55
|
+
<rate from="USD" to="CHF" rate="0.906035" comment="SWITZERLAND Franc" />
|
56
|
+
<rate from="USD" to="TWD" rate="30.40283" comment="TAIWAN Dollar" />
|
57
|
+
<rate from="USD" to="THB" rate="30.89487" comment="THAILAND Baht" />
|
58
|
+
<rate from="USD" to="AED" rate="3.672955" comment="U.A.E. Dirham" />
|
59
|
+
<rate from="USD" to="UAH" rate="7.988582" comment="UKRAINE Hryvnia" />
|
60
|
+
<rate from="USD" to="GBP" rate="0.647910" comment="UNITED KINGDOM Pound" />
|
61
|
+
|
62
|
+
<!-- Cross-rates for some common currencies -->
|
63
|
+
<rate from="EUR" to="GBP" rate="0.869914" />
|
64
|
+
<rate from="EUR" to="NOK" rate="7.800095" />
|
65
|
+
<rate from="GBP" to="NOK" rate="8.966508" />
|
66
|
+
</rates>
|
67
|
+
</currencyConfig>
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with
|
3
|
+
# this work for additional information regarding copyright ownership.
|
4
|
+
# The ASF licenses this file to You under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with
|
6
|
+
# the License. You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
# a couple of test stopwords to test that the words are really being
|
17
|
+
# configured from this file:
|
18
|
+
stopworda
|
19
|
+
stopwordb
|
20
|
+
|
21
|
+
# Standard english stop words taken from Lucene's StopAnalyzer
|
22
|
+
a
|
23
|
+
an
|
24
|
+
and
|
25
|
+
are
|
26
|
+
as
|
27
|
+
at
|
28
|
+
be
|
29
|
+
but
|
30
|
+
by
|
31
|
+
for
|
32
|
+
if
|
33
|
+
in
|
34
|
+
into
|
35
|
+
is
|
36
|
+
it
|
37
|
+
no
|
38
|
+
not
|
39
|
+
of
|
40
|
+
on
|
41
|
+
or
|
42
|
+
such
|
43
|
+
that
|
44
|
+
the
|
45
|
+
their
|
46
|
+
then
|
47
|
+
there
|
48
|
+
these
|
49
|
+
they
|
50
|
+
this
|
51
|
+
to
|
52
|
+
was
|
53
|
+
will
|
54
|
+
with
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# The ASF licenses this file to You under the Apache License, Version 2.0
|
2
|
+
# (the "License"); you may not use this file except in compliance with
|
3
|
+
# the License. You may obtain a copy of the License at
|
4
|
+
#
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
#
|
7
|
+
# Unless required by applicable law or agreed to in writing, software
|
8
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
9
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
10
|
+
# See the License for the specific language governing permissions and
|
11
|
+
# limitations under the License.
|
12
|
+
|
13
|
+
#-----------------------------------------------------------------------
|
14
|
+
# Use a protected word file to protect against the stemmer reducing two
|
15
|
+
# unrelated words to the same base word.
|
16
|
+
|
17
|
+
# Some non-words that normally won't be encountered,
|
18
|
+
# just to test that they won't be stemmed.
|
19
|
+
dontstems
|
20
|
+
zwhacky
|
21
|
+
|