gpt4 book ai didi

ruby-on-rails - Elasticsearch : Multi match query on nested fields

转载 作者:行者123 更新时间:2023-12-01 22:52:04 25 4
gpt4 key购买 nike

我在 RoR 中遇到多匹配查询问题。我已经配置了 Elastic Search 并且可以正常工作,但是我正在努力设置到目前为止似乎有效的聚合,但是无论出于何种原因,我都无法在我正在聚合的字段上进行搜索。这是我模型的摘录:

    settings :index => { :number_of_shards => 1 } do
mapping do
indexes :id, index: :not_analyzed
indexes :name
indexes :summary
indexes :description

indexes :occasions, type: 'nested' do
indexes :id, type: 'integer'
indexes :occasion_name, type: 'string', index: :not_analyzed

...

end
end
end




def as_indexed_json(options = {})
self.as_json(only: [:id, :name, :summary, :description],
include: {
occasions: { only: [:id, :occasion_name] },
courses: { only: [:id, :course_name] },
allergens: { only: [:id, :allergen_name] },
cookingtechniques: { only: [:id, :name] },
cuisine: { only: [:id, :cuisine_name]}
})
end


class << self
def custom_search(query)
__elasticsearch__.search(query: multi_match_query(query), aggs: aggregations)
end


def multi_match_query(query)
{
multi_match:
{
query: query,
type: "best_fields",
fields: ["name^9", "summary^8", "cuisine_name^7", "description^6", "occasion_name^6", "course_name^6", "cookingtechniques.name^5"],
operator: "and"
}
}
end

我能够搜索除“occasion_name”之外的 multi_match_query 中指定的所有字段,这恰好是我正在聚合的字段。我已检查该字段是否已正确编入索引(使用 Elasticsearch 头插件)。我还能够在我的 View 中显示带有聚合 occasion_names 的构面。我尝试了所有我能想到的方法,包括删除聚合和搜索 occasion_name,但仍然没有成功。(我正在使用 elasticsearch-rails gem)

任何帮助将不胜感激。

编辑:

我从 rails 得到这个 ES 查询:

@search=
#<Elasticsearch::Model::Searching::SearchRequest:0x007f91244df460
@definition=
{:index=>"recipes",
:type=>"recipe",
:body=>
{:query=>
{:multi_match=>
{:query=>"Christmas",
:type=>"best_fields",
:fields=>["name^9", "summary^8", "cuisine_name^7", "description^6", "occasion_name^6", "course_name^6", "cookingtechniques.name^5"],
:operator=>"and"}},
:aggs=>
{:occasion_aggregation=>
{:nested=>{:path=>"occasions"}, :aggs=>{:id_and_name=>{:terms=>{:script=>"doc['occasions.id'].value + '|' + doc['occasions.occasion_name'].join(' ')", :size=>35}}}}}}},

这是为我用于测试的虚拟食谱之一编制索引的所有示例(内容无意义 - 我仅将其用于测试):

{
"_index": "recipes",
"_type": "recipe",
"_id": "7",
"_version": 1,
"_score": 1,
"_source": {
"id": 7,
"name": "Mustard-stuffed chicken",
"summary": "This is so good we'd be surprised if this chicken fillet recipe doesn't become a firm favourite. Save it to your My Good Food collection and enjoy",
"description": "Heat oven to 200C/fan 180C/gas 6. Mix the cheeses and mustard together. Cut a slit into the side of each chicken breast, then stuff with the mustard mixture. Wrap each stuffed chicken breast with 2 bacon rashers – not too tightly, but enough to hold the chicken together. Season, place on a baking sheet and roast for 20-25 mins.",
"occasions": [
{
"id": 9,
"occasion_name": "Christmas"
}
,
{
"id": 7,
"occasion_name": "Halloween"
}
,
{
"id": 8,
"occasion_name": "Bonfire Night"
}
,
{
"id": 10,
"occasion_name": "New Year"
}
],
"courses": [
{
"id": 9,
"course_name": "Side Dish"
}
,
{
"id": 7,
"course_name": "Poultry"
}
,
{
"id": 8,
"course_name": "Salad"
}
,
{
"id": 10,
"course_name": "Soup"
}
],
"allergens": [
{
"id": 6,
"allergen_name": "Soya"
}
,
{
"id": 7,
"allergen_name": "Nut"
}
,
{
"id": 8,
"allergen_name": "Other"
}
,
{
"id": 1,
"allergen_name": "Dairy"
}
],
"cookingtechniques": [
{
"id": 15,
"name": "Browning"
}
],
"cuisine": {
"id": 1,
"cuisine_name": "African"
}
}
}

编辑 2:

我设法按照@rahulroc 的建议使搜索适用于某些场合,但现在我无法搜索任何其他内容...

    def multi_match_query(query)
{
nested:{
path: 'occasions',
query:{
multi_match:
{
query: query,
type: "best_fields",
fields: ["name^9", "summary^8", "cuisine_name^7", "description^6", "occasion_name^6", "course_name^6", "cookingtechniques.name^5"],
operator: "and"
}
}

}
}
end

更新:添加多个嵌套字段 - 我正在尝试添加其余的聚合,但我遇到了与以前类似的问题。我的最终目标是将聚合用作过滤器,因此我需要在查询中再添加大约 4 个嵌套字段(我也希望这些字段可搜索)这是@rahulroc 提供的工作查询 + 添加另一个我无法搜索的嵌套字段。和以前一样,在索引方面一切正常,我可以显示新添加字段的聚合,但我无法搜索它。我尝试了此查询的不同变体,但我无法使其工作(其余字段仍在工作和可搜索 - 问题只是新字段):

 def multi_match_query(query)
{

bool: {
should: [
{
nested:{
path: 'occasions',
query: {
multi_match:
{
query: query,
type: "best_fields",
fields: ["occasion_name"]

}
}
}
},

{
nested:{
path: 'courses',
query: {
multi_match:
{
query: query,
type: "best_fields",
fields: ["course_name"]

}
}
}
},

{
multi_match: {
query: query,
fields:["name^9", "summary^8", "cuisine_name^7", "description^6"],

}
}
]
}


}
end

最佳答案

您需要创建一个单独的嵌套子句来匹配嵌套字段

"query": {
"bool": {
"should": [
{
"nested": {
"path": "occassions",
"query": {
"multi_match": {
"query": "Christmas",
"fields": ["occassion_name^2"]
}
}
}
},
{
"multi_match": {
"query": "Christmas",
"fields":["name^9", "summary^8", "cuisine_name^7", "description^6","course_name^6"] }
}
]
}
}

关于ruby-on-rails - Elasticsearch : Multi match query on nested fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36273037/

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