ruby-on-rails - Elasticsearch 的拼写检查 Ngram 不适用于 Rails

标签 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

搜索 Controller 代码:

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

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

     @documents.results.to_a 

给出一个空数组。

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

最佳答案

尝试在您的multi_match 查询中添加模糊性:

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

说明

Kstem 过滤器用于将单词缩减为词根形式,它在此处并不像您预期​​的那样工作 - 它会正确处理像 RentaRent 这样的短语,但不会您提供的拼写错误。

您可以检查词干提取如何使用以下查询:

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"
        }
    ]
}

因此,通过应用模糊处理,典型的拼写错误会得到更好的处理。

关于ruby-on-rails - Elasticsearch 的拼写检查 Ngram 不适用于 Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45408440/

相关文章:

ruby-on-rails - Rails - 基于另一个模型验证属性

ruby-on-rails - 使用 Keycloak 实现单点登录

elasticsearch - 在 elasticsearch 中使用特殊字符搜索

Python Elasticsearch : BulkIndexError: 'not_x_content_exception' while trying to use helpers. 批量

ruby-on-rails - 如何在 Elasticsearch 中查询数组元素

ruby-on-rails - Prawn PDF中的页眉和页脚

ruby-on-rails - 是否可以在 Controller 内使用 "number_to_currency"?

elasticsearch - 如何编写脚本字段以获取状态转换之间的天数

ruby-on-rails - Elasticsearch::Transport::Transport::Errors::NotFound ([404] {"error": {"root_cause":[ {"type":"index_not_found_exception"

ruby - Ruby On Rails 中的 Elasticsearch 从 0.90 升级到 2.x