diff --git a/README.md b/README.md index 501ab1d..ca17ee6 100644 --- a/README.md +++ b/README.md @@ -307,6 +307,8 @@ class Product < ApplicationRecord 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] + ### Synonyms ```ruby diff --git a/lib/searchkick/index_options.rb b/lib/searchkick/index_options.rb index 5d6fcda..1aa93ab 100644 --- a/lib/searchkick/index_options.rb +++ b/lib/searchkick/index_options.rb @@ -142,7 +142,8 @@ module Searchkick } } - if language == "chinese" + case language + when "chinese" settings[:analysis][:analyzer].merge!( default_analyzer => { type: "ik_smart" @@ -156,6 +157,18 @@ module Searchkick ) settings[:analysis][:filter].delete(:searchkick_stemmer) + when "ukrainian" + settings[:analysis][:analyzer].merge!( + default_analyzer => { + type: "ukrainian" + }, + searchkick_search: { + type: "ukrainian" + }, + searchkick_search2: { + type: "ukrainian" + } + ) end if Searchkick.env == "test" diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index 1bdced8..3600c56 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -314,10 +314,12 @@ module Searchkick if field == "_all" || field.end_with?(".analyzed") shared_options[:cutoff_frequency] = 0.001 unless operator.to_s == "and" || misspellings == false - qs.concat [ - shared_options.merge(analyzer: "searchkick_search"), - shared_options.merge(analyzer: "searchkick_search2") - ] + qs << shared_options.merge(analyzer: "searchkick_search") + + # searchkick_search and searchkick_search2 are the same for ukrainian + unless searchkick_options[:language] == "ukranian" + qs << shared_options.merge(analyzer: "searchkick_search2") + end exclude_analyzer = "searchkick_search2" elsif field.end_with?(".exact") f = field.split(".")[0..-2].join(".") diff --git a/test/language_test.rb b/test/language_test.rb index 12e0d1a..1580a4b 100644 --- a/test/language_test.rb +++ b/test/language_test.rb @@ -2,13 +2,13 @@ require_relative "test_helper" class LanguageTest < Minitest::Test def setup + skip unless ENV["LANGUAGE"] + Song.destroy_all end def test_chinese # requires https://github.com/medcl/elasticsearch-analysis-ik - skip unless ENV["CHINESE"] - with_options(Song, language: "chinese") do store_names ["中华人民共和国国歌"], Song assert_search "中华人民共和国", ["中华人民共和国国歌"], {}, Song @@ -16,4 +16,12 @@ class LanguageTest < Minitest::Test assert_search "人", [], {}, Song end end + + def test_ukrainian + # 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 + end + end end -- libgit2 0.21.0