gpt4 book ai didi

ruby-on-rails - 带有轮胎 : edgeNgram with multiple words 的 Elasticsearch

转载 作者:行者123 更新时间:2023-11-29 02:55:20 30 4
gpt4 key购买 nike

假设我有 5 部电影片名:

  • 无太阳
  • 珊莎
  • 这也是
  • Solr 古德
  • 唯一幸存者

我想实现一个具有这种预期行为的自动完成搜索字段:

  • “Sans”> Sans Soleil,Sansa
  • “Sans so” > Sans Soleil
  • "So"> So Is This, Sol Goode, Sole Survivor
  • “如此”>“如此”
  • “Sol”> Sol Goode,Sole Survivor,Sans Soleil

这个用例似乎很明显,而且肯定被许多人使用过,但我就是无法让它正常工作,而且我似乎找不到任何答案或文档来提供帮助。这是我当前的模型:

class Film < Media
include Tire::Model::Search
include Tire::Model::Callbacks

settings :analysis => {
:filter => {
:title_ngram => {
"type" => "edgeNGram",
"min_gram" => 2,
"max_gram" => 8,
"side" => "front" }
},
:analyzer => {
:title_analyzer => {
"tokenizer" => "lowercase",
"filter" => ["title_ngram"],
"type" => "custom" }
}
} do
mapping do
indexes :title, :type => 'string', :analyzer => 'title_analyzer'
indexes :int_english_title, :type => 'string', :analyzer => 'title_analyzer'
end
end
end

以及如何在我的 search_controller 中处理查询:

search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
s.query do |query|
query.string "title:#{params[:search]}"
end
end
@results = search.results

这会产生一些奇怪的行为:

  • “Sans so”按顺序返回“Sansa、Sans Soleil、So Is This”。
  • “So is”按顺序返回“Sol Goode、Sans Soleil、Sole Survivor、So Is This”。

最佳答案

我认为您可以使用 match 实现您想要的效果查询设置为 type:"phrase_prefix"。大多数(但不是全部)示例都可以使用。

使用 Ngrams,您可以更好地控制流程,但它们的召回率相当高(它们通常会返回比您想要的更多的数据),您必须与之抗争。这就是您使用多个查询词(“Sans so”)观察到的“奇怪行为”,因为它们是作为 Sans OR so 查询有效执行的。

尝试使用 default_operator: "AND" 选项(参见轮胎的 query_string_test.rb ),或者更确切地说是 match使用 operator: "AND" 选项查询(参见 Tire 的 match_query_test.rb)。

有一些关于自动完成、Tire 和 Ngrams 的文章:

关于ruby-on-rails - 带有轮胎 : edgeNgram with multiple words 的 Elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14120127/

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