Символы в строке запроса для эластичного поиска

Я имею "документы» (активные записи) с атрибутом, называемым отклонениями. Атрибут имеет значения типа "Бин Х " "Bin $ " "Бин q " "Бин% " и т.п.

Я пытаюсь использовать шина /asticsearch для поиска атрибута. Я использую анализатор пробелов для индексации атрибута отклонения. Вот мой код для создания индексов:

settings :analysis => {
    :filter  => {
      :ngram_filter => {
        :type => "nGram",
        :min_gram => 2,
        :max_gram => 255
      },
      :deviation_filter => {
        :type => "word_delimiter",
        :type_table => ['$ => ALPHA']
      }
    },
    :analyzer => {
      :ngram_analyzer => {
        :type  => "custom",
        :tokenizer  => "standard",
        :filter  => ["lowercase", "ngram_filter"]
      },
      :deviation_analyzer => {
        :type => "custom",
        :tokenizer => "whitespace",
        :filter => ["lowercase"]
      }
    }
  } do
    mapping do
      indexes :id, :type => 'integer'
      [:equipment, :step, :recipe, :details, :description].each do |attribute|
        indexes attribute, :type => 'string', :analyzer => 'ngram_analyzer'
      end
      indexes :deviation, :analyzer => 'whitespace'
    end
  end

Похоже, что поиск работает нормально, когда строка запроса не содержит специальных символов. НапримерBin X вернет только те записи, которые имеют словаBin А ТАКЖЕX в них. Тем не менее, в поисках чего-то вродеBin $ или жеBin % показывает все результаты, которые имеют словоBin почти игнорируя символ (результаты с символом отображаются выше при поиске без результатов).

Вот метод поиска, который я создал

def self.search(params)
    tire.search(load: true) do
      query { string "#{params[:term].downcase}:#{params[:query]}", default_operator: "AND" }
        size 1000
    end
end

и вот как я строю форму поиска:


     "formtastic issue", method: :get do %>
        
        
            
                
                
                
                
            
        
        
    

Ответы на вопрос(1)

Ваш ответ на вопрос