2013-03-06 1 views
0

Если у меня есть две строки:EdgeNGram с Тиром и ElasticSearch

  • Doe, Джо
  • Doe, Джонатан

Я хочу осуществить поиск таким образом, что:

  • «Doe»> «Doe, Joe», «Doe, Jonathan»
  • «Doe J»> «Doe, Joe», «Doe, Jonathan»
  • "Джон Доу"> "Doe, Джонатан"
  • "Йона Do"> "Doe, Джонатан"

Вот код, у меня есть:

settings analysis: { 
    filter: { 
     nameNGram: { 
     type: "edgeNGram", 
     min_gram: 1, 
     max_gram: 20, 
     } 
    }, 
    tokenizer: { 
     non_word: { 
     type: "pattern", 
     pattern: "[^\\w]+" 
     } 
    }, 
    analyzer: { 
     name_analyzer: { 
     type: "custom", 
     tokenizer: "non_word", 
     filter: ["lowercase", "nameNGram"] 
     }, 
    } 
    } do 
    mapping do 
    indexes :name, type: "multi_field", fields: { 
     analyzed: { type: "string", index: :analyzed, index_analyzer: "name_analyzer" }, # for indexing 
     unanalyzed: { type: "string", index: :not_analyzed, :include_in_all => false } # for sorting 
    } 
    end 
end 

def self.search(params) 
    tire.search(:page => params[:page], :per_page => 20) do 
    query do 
     string "name.analyzed:" + params[:query], default_operator: "AND" 
    end 
    sort do 
     by "name.unanalyzed", "asc" 
    end 
    end 
end 

К сожалению, это Безразлично Кажется, что он работает ... Токенизация выглядит великолепно, потому что «Доу, Джонатан» я получаю что-то вроде «d», «do», «doe», «j», «jo», «jon», «jona» »и т. д., но если я ищу« do AND jo », я ничего не верну. Если я, однако, ищу «дзону», я вернусь «Доу, Джонатан». Что я делаю не так?

ответ

0

Возможно, вы хотите использовать только EdgeNGram, если хотите создать автозаполнение. Я подозреваю, что вы хотите использовать фильтр шаблонов для разделения слов на запятую.

Что-то вроде этого:

"tokenizer": { 
    "comma_pattern_token": { 
     "type": "pattern", 
     "pattern": ",", 
     "group": -1 
    } 
} 

Если я ошибаюсь, и вы должны edgeNGrams по какой-то другой причине, то ваша проблема в том, что ваш анализатор индекса игнорирует стоп-слова (например, слово AND) и анализатора поиска не является. Вам необходимо создать собственный анализатор для вашего поискового_анализатора, который не включает фильтр стоп-слова.