diff --git a/CHANGELOG.md b/CHANGELOG.md index 51b59c9..6d9d913 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 3.0.0 [unreleased] - Better performance +- Added support for Chinese Breaking changes diff --git a/README.md b/README.md index d3d8aaf..bcf5910 100644 --- a/README.md +++ b/README.md @@ -291,6 +291,14 @@ end [See the list of stemmers](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-stemmer-tokenfilter.html) +For Chinese, install the [elasticsearch-analysis-ik plugin](https://github.com/medcl/elasticsearch-analysis-ik) and use: + +```ruby +class Product < ApplicationRecord + searchkick language: "chinese" +end +``` + ### Synonyms ```ruby diff --git a/lib/searchkick/index_options.rb b/lib/searchkick/index_options.rb index 96a8432..88f582d 100644 --- a/lib/searchkick/index_options.rb +++ b/lib/searchkick/index_options.rb @@ -143,6 +143,22 @@ module Searchkick } } + if language == "chinese" + settings[:analysis][:analyzer].merge!( + default_analyzer => { + type: "ik_smart" + }, + searchkick_search: { + type: "ik_smart" + }, + searchkick_search2: { + type: "ik_max_word" + } + ) + + settings[:analysis][:filter].delete(:searchkick_stemmer) + end + if Searchkick.env == "test" settings[:number_of_shards] = 1 settings[:number_of_replicas] = 0 diff --git a/test/language_test.rb b/test/language_test.rb new file mode 100644 index 0000000..ab5d9c4 --- /dev/null +++ b/test/language_test.rb @@ -0,0 +1,15 @@ +require_relative "test_helper" + +class LanguageTest < Minitest::Test + def setup + Song.destroy_all + end + + def test_chinese + skip unless ENV["CHINESE"] + store_names ["中华人民共和国国歌"], Song + assert_search "中华人民共和国", ["中华人民共和国国歌"], {}, Song + assert_search "国歌", ["中华人民共和国国歌"], {}, Song + assert_search "人", [], {}, Song + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 334c37a..8c1127e 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -117,6 +117,12 @@ if defined?(Mongoid) field :name end + + class Song + include Mongoid::Document + + field :name + end elsif defined?(NoBrainer) NoBrainer.configure do |config| config.app_name = :searchkick @@ -184,6 +190,13 @@ elsif defined?(NoBrainer) field :id, type: String field :name, type: String end + + class Song + include NoBrainer::Document + + field :id, type: Object + field :name, type: String + end elsif defined?(Cequel) cequel = Cequel.connect( @@ -272,7 +285,14 @@ elsif defined?(Cequel) column :name, :text end - [Product, Store, Region, Speaker, Animal].each(&:synchronize_schema) + class Song + include Cequel::Record + + key :id, :timeuuid, auto: true + column :name, :text + end + + [Product, Store, Region, Speaker, Animal, Sku, Song].each(&:synchronize_schema) else require "active_record" @@ -363,6 +383,10 @@ else t.string :name end + ActiveRecord::Migration.create_table :songs do |t| + t.string :name + end + class Product < ActiveRecord::Base belongs_to :store end @@ -388,6 +412,9 @@ else class Sku < ActiveRecord::Base end + + class Song < ActiveRecord::Base + end end class Product @@ -508,6 +535,10 @@ class Sku searchkick callbacks: defined?(ActiveJob) ? :async : true end +class Song + searchkick language: "chinese" +end + Product.searchkick_index.delete if Product.searchkick_index.exists? Product.reindex Product.reindex # run twice for both index paths @@ -517,6 +548,7 @@ Store.reindex Animal.reindex Speaker.reindex Region.reindex +Song.reindex class Minitest::Test def setup -- libgit2 0.21.0