gpt4 book ai didi

ruby-on-rails - 在 Rails 4 中使用 Elasticsearch 和 Tire 进行 Asciifolding 不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:15 24 4
gpt4 key购买 nike

我在我的 Rails 4 应用程序中创建了一个搜索引擎,它工作得很好,但我很难让 asciifolding 过滤器工作。我的模型有很多带重音的术语,除非拼写完全正确,否则不会出现,即:我想搜索“Rodriguez”以显示带有“Rodríguez”的结果。我尝试遵循许多不同的示例,但出于某种原因,当我使用以下代码重置我的数据库时,搜索根本不起作用(我没有收到错误,但无论查询如何,都没有出现)。

这是我的模型:

class Product < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks

settings :analysis => {
:analyzer => {
:default => {
:tokenizer => "standard",
:filter => ["standard", "asciifolding"]
}
}
} do

mapping do
indexes :id, type: 'integer', index: :not_analyzed
indexes :name, boost: 5, analyzer: 'default'
indexes :website, index: :not_analyzed
indexes :price, type: 'integer', index: :not_analyzed
indexes :artist, boost: 3, analyzer: 'default'
indexes :company, boost: 4, analyzer: 'default'
indexes :date, type: 'date', index: :not_analyzed
end
end

def self.search(params)
tire.search(page: params[:page], per_page: 12) do
query { string params[:query], default_operator: "AND" } if params[:query].present?
end
end

在测试之前,我使用以下命令清除数据库:

rake db:setup

然后我运行:

rake environment tire:import CLASS=Product FORCE=true

我查看了许多不同的资源,包括 elasticsearch 和轮胎文档,但无论出于何种原因(我预料到一个愚蠢的错误)它根本行不通。请注意,为了填充我的数据库,我一直在导入一个 csv 文件,但我不明白为什么这会产生任何影响,特别是考虑到在这种形式的搜索中没有任何结果(当我删除时它工作正常,没有重音问题设置部分,只有映射 block 和搜索方法)。我需要调用某种 Tire.index 并导入吗?感谢您的帮助!

更新

所以我对搜索查询进行了修改,解决了这个问题,但又引发了一个新问题:

    def self.search(params)
tire.search(page: params[:page], per_page: 12) do
query { string params[:query], analyzer: :search_analyzer, :default_field => 'name' } if params[:query].present?
end
end

通过确定一个默认字段,我现在可以搜索重音不可知论者,但现在我的搜索仅限于名称,我无法收到以前有效的其他索引属性的结果。有谁知道如何设置多个默认字段?

最佳答案

这是我在生产中使用的示例。它不是解决方案您的问题,但它会让您离开地面。我的代码使用 ICU plugin对于 icu_folding , shingle_filter , multi_fieldTire .另请注意 Tireretired自 2013 年 9 月以来,您应该使用 elasticsearch-rubyelasticsearch-rails如果它是一个新项目。使用此代码,我可以自动完成类似 Rod 查找 Rodríguez 的情况。

class Profile
# ...
include Tire::Model::Persistence
# I'm also using ES as persistance storage.
include Tire::Model::DynamicPersistence

property :title, analyzer: 'snowball', type: :multi_field,
fields: {
title: {
type: 'string',
boost: 20.0,
search_analyzer: "autocomplete_search_analyzer",
index_analyzer: "autocomplete_indexer_analyzer"
},
completed: {
type: 'string',
boost: 15.0,
search_analyzer: "autocomplete_search_analyzer",
index_analyzer: "autocomplete_indexer_analyzer"
}
}

CONFIGURATION = {
settings: {
analysis: {
analyzer: {
shingle_analyzer: {
tokenizer: "keyword",
filter: ["icu_folding", "lowercase", "shingle_filter"]
},
sx_index_analyzer: {
tokenizer: "standard",
filter: ["icu_folding", "lowercase"]
},
sx_search_analyzer: {
tokenizer: "standard",
filter: ["icu_folding", "lowercase"]
}
},
filter: {
shingle_filter: {
type: "shingle",
min_shingle_size: 2,
max_shingle_size: 5
}
}

}
},

mappings: {
profile: {
"_all" => {
enabled: true,
index_analyzer: "sx_index_analyzer",
search_analyzer: "sx_search_analyzer"
},

properties: {
title: {
type: "multi_field",
fields: {
title: {
type: "string",
store: "yes",
boost: 20.0
#index_analyzer: "sx_index_analyzer",
#search_analyzer: "sx_search_analyzer"
},
sortable: {
type: "string",
index: "analyzed"
},
autocomplete: {
type: "string",
index_analyzer: "shingle_analyzer",
boost: 15.0
},
}
}
}
}
}
}

def self.rebuild_index
Tire.index Profile.index_name do
delete if Profile.index.exists?
create Profile::CONFIGURATION
end
end
end

希望对您有所帮助!

关于ruby-on-rails - 在 Rails 4 中使用 Elasticsearch 和 Tire 进行 Asciifolding 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24965691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com