拼写检查Ngram弹性搜索不使用rails

时间:2017-07-31 06:00:40

标签: ruby-on-rails elasticsearch elasticsearch-rails

我在我的模型中使用了拼写检查,以便用户输入类似" Rentaal"然后它应该获取正确的数据" Rental"

document.rb代码

require 'elasticsearch/model'

class Document < ApplicationRecord
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks
  belongs_to :user

  Document.import force: true


  def self.search(query)
  __elasticsearch__.search({
      query: {
        multi_match: {
          query: query,
          fields: ['name^10', 'service']
      }
    }
    })
  end


  settings index: { 
    "number_of_shards": 1, 
    analysis: {
      analyzer: {
        edge_ngram_analyzer: { type: "custom", tokenizer: "standard", filter: 
          ["lowercase", "edge_ngram_filter", "stop", "kstem" ] },
            }
        },
        filter: {
                  edge_ngram_filter: { type: "edgeNGram", min_gram: "3", max_gram: 
                  "20" } 
      }
    } do
    mapping do
      indexes :name, type: "string", analyzer: "edge_ngram_analyzer"
      indexes :service, type: "string", analyzer: "edge_ngram_analyzer"
    end 
  end
end

搜索控制器代码:

def search
  if params[:query].nil?
    @documents = []
  else
    @documents = Document.search params[:query]
  end
end

但是,如果我输入Rentaal或任何拼写错误的单词,它不会显示任何内容。 在我的控制台中

     @documents.results.to_a 

给出一个空数组。

我在这里做错了什么?如果需要更多数据,请告诉我。

1 个答案:

答案 0 :(得分:1)

尝试在fuzziness查询中添加multi_match

{
      "query": {
        "multi_match": {
          "query": "Rentaal",
          "fields": ["name^10", "service"],
          "fuzziness": "AUTO"
      }
    }
}

解释

Kstem过滤器用于将单词缩减为其根形式,但它不能像您期望的那样工作 - 它会处理像RentaRent这样的核心短语,而不会处理您提供的拼写错误。< / p>

您可以查看阻止如何使用以下查询:

curl -X POST \
  'http://localhost:9200/my_index/_analyze?pretty=true' \
  -d '{
  "analyzer" : "edge_ngram_analyzer",
  "text" : ["rentaal"]
}'

结果我看到了:

{
    "tokens": [
        {
            "token": "ren"
        },
        {
            "token": "rent"
        },
        {
            "token": "renta"
        },
        {
            "token": "rentaa"
        },
        {
            "token": "rentaal"
        }
    ]
}

通过应用模糊性,可以更好地处理典型的拼写错误。