-
-
Save karmi/4526141 to your computer and use it in GitHub Desktop.
| require 'tire' | |
| # Tire.configure { logger STDERR, level: 'debug' } | |
| Tire.index('movie-titles') do | |
| delete | |
| create \ | |
| settings: { | |
| index: { | |
| analysis: { | |
| tokenizer: { | |
| title_tokenizer: { | |
| type: 'whitespace' | |
| }, | |
| }, | |
| filter: { | |
| title_ngram_filter: { | |
| type: 'edgeNGram', | |
| min_gram: 1, | |
| max_gram: 16, | |
| side: 'front' | |
| } | |
| }, | |
| analyzer: { | |
| title_default_analyzer: { | |
| type: 'custom', | |
| tokenizer: 'title_tokenizer', | |
| filter: ['lowercase', 'asciifolding'] | |
| }, | |
| title_snowball_analyzer: { | |
| type: 'custom', | |
| tokenizer: 'title_tokenizer', | |
| filter: ['lowercase', 'asciifolding', 'snowball'] | |
| }, | |
| title_shingle_analyzer: { | |
| type: 'custom', | |
| tokenizer: 'title_tokenizer', | |
| filter: ['shingle', 'lowercase', 'asciifolding'] | |
| }, | |
| title_ngram_analyzer: { | |
| type: 'custom', | |
| tokenizer: 'title_tokenizer', | |
| filter: ['lowercase', 'asciifolding', 'title_ngram_filter'] | |
| }, | |
| title_search_analyzer: { | |
| type: 'custom', | |
| tokenizer: 'title_tokenizer', | |
| filter: ['lowercase', 'asciifolding'] | |
| } | |
| } | |
| } | |
| }, | |
| }, | |
| mappings: { | |
| document: { | |
| properties: { | |
| title: { | |
| type: 'multi_field', | |
| fields: { | |
| title: { type: 'string', analyzer: 'title_default_analyzer' }, | |
| stemmed: { type: 'string', analyzer: 'title_snowball_analyzer' }, | |
| shingles: { type: 'string', analyzer: 'title_shingle_analyzer' }, | |
| ngrams: { type: 'string', index_analyzer: 'title_ngram_analyzer', search_analyzer: 'title_search_analyzer' } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| store id: 1, title: "The Lord of the Rings" | |
| store id: 2, title: "Lord of the Flies" | |
| store id: 3, title: "The Ring" | |
| store id: 4, title: "Lords of Dogtown" | |
| store id: 5, title: "The Postman Always Rings Twice" | |
| refresh | |
| end | |
| queries = [ | |
| 'lord of the rin', | |
| 'lord of the r', | |
| 'lord of r', | |
| 'lord ring', | |
| 'lord rin', | |
| 'lo ri', | |
| 'lord', | |
| 'lo', | |
| 'rings', | |
| 'ring', | |
| 'rin', | |
| 'ri', | |
| 'r' | |
| ] | |
| queries.each do |q| | |
| puts '='*80, | |
| "QUERY: '#{q}'", | |
| '='*80 | |
| s = Tire.search('movie-titles') do | |
| query do | |
| match ['title^10', 'title.snowball^2', 'title.shingles^2', 'title.ngrams'], q, operator: 'and' | |
| end | |
| explain true | |
| end | |
| s.results.each do |result| | |
| puts "#{result.title.ljust(30)} (Score: #{result._score})", | |
| # result._explanation, | |
| '-'*80 | |
| end | |
| puts | |
| end |
| ================================================================================ | |
| QUERY: 'lord of the rin' | |
| ================================================================================ | |
| The Lord of the Rings (Score: 0.008028548) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'lord of the r' | |
| ================================================================================ | |
| The Lord of the Rings (Score: 0.008028548) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'lord of r' | |
| ================================================================================ | |
| The Lord of the Rings (Score: 0.005668437) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'lord ring' | |
| ================================================================================ | |
| The Lord of the Rings (Score: 0.0039382037) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'lord rin' | |
| ================================================================================ | |
| The Lord of the Rings (Score: 0.0039382037) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'lo ri' | |
| ================================================================================ | |
| The Lord of the Rings (Score: 0.002912885) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'lord' | |
| ================================================================================ | |
| Lord of the Flies (Score: 0.15342641) | |
| -------------------------------------------------------------------------------- | |
| The Lord of the Rings (Score: 0.13424811) | |
| -------------------------------------------------------------------------------- | |
| Lords of Dogtown (Score: 0.0023539662) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'lo' | |
| ================================================================================ | |
| Lords of Dogtown (Score: 0.0023539662) | |
| -------------------------------------------------------------------------------- | |
| Lord of the Flies (Score: 0.0023539662) | |
| -------------------------------------------------------------------------------- | |
| The Lord of the Rings (Score: 0.0020597205) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'rings' | |
| ================================================================================ | |
| The Postman Always Rings Twice (Score: 0.13424811) | |
| -------------------------------------------------------------------------------- | |
| The Lord of the Rings (Score: 0.13424811) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'ring' | |
| ================================================================================ | |
| The Ring (Score: 0.19178301) | |
| -------------------------------------------------------------------------------- | |
| The Lord of the Rings (Score: 0.0020597205) | |
| -------------------------------------------------------------------------------- | |
| The Postman Always Rings Twice (Score: 0.0017654747) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'rin' | |
| ================================================================================ | |
| The Ring (Score: 0.0035309494) | |
| -------------------------------------------------------------------------------- | |
| The Lord of the Rings (Score: 0.0020597205) | |
| -------------------------------------------------------------------------------- | |
| The Postman Always Rings Twice (Score: 0.0017654747) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'ri' | |
| ================================================================================ | |
| The Ring (Score: 0.0035309494) | |
| -------------------------------------------------------------------------------- | |
| The Lord of the Rings (Score: 0.0020597205) | |
| -------------------------------------------------------------------------------- | |
| The Postman Always Rings Twice (Score: 0.0017654747) | |
| -------------------------------------------------------------------------------- | |
| ================================================================================ | |
| QUERY: 'r' | |
| ================================================================================ | |
| The Ring (Score: 0.0035309494) | |
| -------------------------------------------------------------------------------- | |
| The Lord of the Rings (Score: 0.0020597205) | |
| -------------------------------------------------------------------------------- | |
| The Postman Always Rings Twice (Score: 0.0017654747) | |
| -------------------------------------------------------------------------------- | |
| [Finished in 4.1s] |
Brilliant one ! Adding fuzziness along with this made good auto complete for my search.
Which version of ElasticSearch is this for?
Guys... just made a pertty close analysers like this, but when I try to search with a long string (like the result of ''lord of the rin'' ), it´s not returnig just the unique one, it is returning all regs.
Just posted on stackoverflow, http://stackoverflow.com/questions/43902570/elasticsearch-multiple-analysers-not-working
If someone can help I would be grateful.
cheers
Thank you, this was helpful, but might need to be updated since there are many changes in current version of ES.
Thank God!. I searched "elasticsearch mapping multiple custom analyzers" on google. Finally found it! You saved tons of my time. Thank you!
Is title.snowball at https://gist.github.com/karmi/4526141#file-movie-titles-rb-L103 meant to say title.stemmed?