gpt4 book ai didi

ruby-on-rails - 在Elasticsearch中将条件运算符与构面混合

转载 作者:行者123 更新时间:2023-12-02 22:52:36 26 4
gpt4 key购买 nike

我正在尝试将搜索查询与两个字段进行匹配,以及如果从页面的下拉列表中进行选择,则按构面进行过滤。

用户输入关键字时,如果在两个数据库字段(标题和说明)中找到它,则该关键字应匹配。下拉列表按状态和类型过滤。

这是我的Tyre搜索配置:

  def self.search(params)
tire.search(load: true, page: params[:page], per_page: 25) do
query do
boolean do
should { string "title:#{params[:query]}", default_operator: "OR" } if params[:query].present?
should { string "description:#{params[:query]}", default_operator: "OR" } if params[:query].present?
must { term :status_id, params[:status_id] } if params[:status_id].present?
must { term :type_id, params[:type_id] } if params[:type_id].present?
end
end
sort { by :updated_at, "desc" } if params[:query].blank?
facet "status" do
terms :status_id
end
facet "type" do
terms :type_id
end
end
end

索引设置:
  settings :analysis => {
:filter => {
:my_ngram => {
"type" => "nGram",
"max_gram" => 10,
"min_gram" => 3}
},
:analyzer => {
:my_analyzer => {
"type" => "custom",
"tokenizer" => "lowercase",
"filter" => ["my_ngram"]
}
}
} do
mapping do
indexes :title, boost: 10, analyzer: 'my_analyzer'
indexes :description, boost: 5, analyzer: 'my_analyzer'
indexes :status_id, :type => 'integer'
indexes :type_id, :type => 'integer'
end
end

我最初只有标题和描述字段,工作正常。我现在尝试添加按状态和类型进行过滤的功能。

什么是正确的配置方式?如果选择了状态,则它仅应返回具有该状态的记录。如果选择了两者,则类型也相同。

任何帮助表示赞赏。

不是发生错误,而是结果不再通过关键字或构面进行过滤:
curl -X GET 'http://localhost:9200/projects/project/_search?load=true&size=25&pretty' -d '{"query":{"bool":{"should":[{"query_string":{"query":"title:test","default_operator":"OR"}},{"query_string":{"query":"description:test","default_operator":"OR"}}],"must":[{"term":{"status_id":{"term":"1"}}},{"term":{"type_id":{"term":"1"}}}]}},"facets":{"status":{"terms":{"field":"status_id","size":10,"all_terms":false}},"type":{"terms":{"field":"type_id","size":10,"all_terms":false}}},"size":25}'

# 2013-08-16 12:08:34:791 [200] (31 msec)
#
# {"took":31,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]},"facets":{"status":{"_type":"terms","missing":0,"total":0,"other":0,"terms":[]},"type":{"_type":"terms","missing":0,"total":0,"other":0,"terms":[]}}}

最佳答案

如果可以创建与之等效的图像,我想您将获得理想的结果。 (请原谅JSON键上没有引号!)

{
query: {
multi_match: {
query: "test",
fields: ["title", "description"]
}
},
filter: {
and: [
{
term: { status_id: 123 }
},
{
term: { type_id: 456 }
}
]
},
facets: {
type: {
terms: {
field: "type_id",
size: 10
}
},
status: {
terms: {
field: "status_id",
size: 10
}
}
}
}

更新资料

我不懂轮胎,但会尝试写点东西!
  def self.search(params)
tire.search(load: true, page: params[:page], per_page: 25) do
query do
boolean do
should { match :title params[:query] } if params[:query].present?
should { match :description params[:query] } if params[:query].present?
end
end

sort { by :updated_at, "desc" } if params[:query].blank?

filter :and, { :term => { :status_id => params[:status_id] } } if params[:status_id].present?
{ :term => { :type_id => params[:type_id] } } if params[:type_id].present?
end
end

您可能需要修复 ruby ,但需要注意一些事项。匹配查询是建议的默认字符串搜索,它比 query_string的查询更快(尽管您的控制权稍差一些)。也

关于ruby-on-rails - 在Elasticsearch中将条件运算符与构面混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18275550/

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