2015-05-14 25 views
0
標題的一部分查找模型

有以下Post模型:使用ElasticSearch/Rails的

class Post < ActiveRecord::Base 
    include Elasticsearch::Model 
    include Elasticsearch::Model::Callbacks 

    def self.search query 
     __elasticsearch__.search(
     { 
      query: { 
       multi_match: { 
        query: query, 
         fields: ['title'] 
       } 
      }, 
       filter: { 
        and: [ 
         { term: { deleted: false } }, 
         { term: { enabled: true } } 
        ] 
       } 
     } 
    ) 
    end 

    settings index: { number_of_shards: 1 } do 
     mappings dynamic: 'false' do 
     indexes :title, analyzer: 'english' 
     end 
    end 
end 

Post.import 

我有一個帖子以「阿姆斯特丹」稱號。當我執行Post.search('阿姆斯特丹')時,我會得到一個記錄,一切都很好。但是如果我執行Post.search('Amster'),我將不會獲得任何記錄。我錯了什麼?我該如何解決它?謝謝!

操作系統 - OS X,ElasticSearch我安裝使用自制

回答

0

你將不得不使用NGRAM分詞器,以創造一個部分文本搜索。如何做到這一點的一個很好的例子可以找到here.這就是說,我會非常小心nGram,因爲它往往可能會出現無關的結果。

這是因爲子字符串「mon」包含在所有字符串中:「monkey」,「money」和「monday」。所有這些都不相關。

或者(我會做什麼。)

你可以嘗試使其成爲一個模糊搜索。但是,模糊搜索的最大距離只有兩個,在您的示例中仍然不會返回任何內容。但是,它傾向於返回相關結果。

的例子,我發現:How to use Fuzzy Search

# Perform a fuzzy search! 
POST /fuzzy_products/product/_search 
{ 
    "query": { 
    "match": { 
     "name": { 
     "query": "Vacuummm", 
     "fuzziness": 2, 
     "prefix_length": 1 
     } 
    } 
    } 
}