diff --git a/CHANGELOG.md b/CHANGELOG.md index 61a7728..b881e1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 3.0.1 [unreleased] - Added `scope` option for partial reindex +- Added support for Japanese, Polish, and Ukranian ## 3.0.0 diff --git a/README.md b/README.md index ca17ee6..85b1340 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ Plus: - easily personalize results for each user - autocomplete - “Did you mean” suggestions +- supports many languages - works with ActiveRecord, Mongoid, and NoBrainer :speech_balloon: Get [handcrafted updates](http://chartkick.us7.list-manage.com/subscribe?u=952c861f99eb43084e0a49f98&id=6ea6541e8e&group[0][4]=true) for new features @@ -299,15 +300,12 @@ 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: +A few languages require plugins: -```ruby -class Product < ApplicationRecord - searchkick language: "chinese" -end -``` - -For Ukranian, install the [analysis-ukrainian plugin](https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/analysis-ukrainian.html) and use `language: "ukrainian"`. [master] +- `chinese` - [elasticsearch-analysis-ik plugin](https://github.com/medcl/elasticsearch-analysis-ik) +- `japanese` - [analysis-kuromoji plugin](https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/analysis-kuromoji.html) +- `polish` - [analysis-stempel plugin](https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/analysis-stempel.html) +- `ukrainian` - [analysis-ukrainian plugin](https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/analysis-ukrainian.html) ### Synonyms diff --git a/lib/searchkick/index_options.rb b/lib/searchkick/index_options.rb index 1aa93ab..4d95cf0 100644 --- a/lib/searchkick/index_options.rb +++ b/lib/searchkick/index_options.rb @@ -157,6 +157,30 @@ module Searchkick ) settings[:analysis][:filter].delete(:searchkick_stemmer) + when "japanese" + settings[:analysis][:analyzer].merge!( + default_analyzer => { + type: "kuromoji" + }, + searchkick_search: { + type: "kuromoji" + }, + searchkick_search2: { + type: "kuromoji" + } + ) + when "polish" + settings[:analysis][:analyzer].merge!( + default_analyzer => { + type: "polish" + }, + searchkick_search: { + type: "polish" + }, + searchkick_search2: { + type: "polish" + } + ) when "ukrainian" settings[:analysis][:analyzer].merge!( default_analyzer => { diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index 06a2c2b..663145a 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -317,7 +317,7 @@ module Searchkick qs << shared_options.merge(analyzer: "searchkick_search") # searchkick_search and searchkick_search2 are the same for ukrainian - unless searchkick_options[:language] == "ukranian" + unless %w(japanese polish ukrainian).include?(searchkick_options[:language]) qs << shared_options.merge(analyzer: "searchkick_search2") end exclude_analyzer = "searchkick_search2" diff --git a/test/language_test.rb b/test/language_test.rb index 1580a4b..8a7fb2e 100644 --- a/test/language_test.rb +++ b/test/language_test.rb @@ -11,9 +11,27 @@ class LanguageTest < Minitest::Test # requires https://github.com/medcl/elasticsearch-analysis-ik with_options(Song, language: "chinese") do store_names ["中华人民共和国国歌"], Song - assert_search "中华人民共和国", ["中华人民共和国国歌"], {}, Song - assert_search "国歌", ["中华人民共和国国歌"], {}, Song - assert_search "人", [], {}, Song + assert_language_search "中华人民共和国", ["中华人民共和国国歌"] + assert_language_search "国歌", ["中华人民共和国国歌"] + assert_language_search "人", [] + end + end + + def test_japanese + # requires https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/analysis-kuromoji.html + with_options(Song, language: "japanese") do + store_names ["JR新宿駅の近くにビールを飲みに行こうか"], Song + assert_language_search "飲む", ["JR新宿駅の近くにビールを飲みに行こうか"] + assert_language_search "jr", ["JR新宿駅の近くにビールを飲みに行こうか"] + assert_language_search "新", [] + end + end + + def test_polish + # requires https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/analysis-stempel.html + with_options(Song, language: "polish") do + store_names ["polski"], Song + assert_language_search "polskimi", ["polski"] end end @@ -21,7 +39,11 @@ class LanguageTest < Minitest::Test # requires https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/analysis-ukrainian.html with_options(Song, language: "ukrainian") do store_names ["ресторани"], Song - assert_search "ресторан", ["ресторани"], {misspellings: false}, Song + assert_language_search "ресторан", ["ресторани"] end end + + def assert_language_search(term, expected) + assert_search term, expected, {misspellings: false}, Song + end end -- libgit2 0.21.0