我实际上可以用这个执行简单的匹配搜索:
query: {match: {searchable: {query:search}}}
这很有效,我的可搜索字段在我的映射中进行了分析。
现在我想对多个字段执行搜索:1个字符串,其他所有字段都是数字。
我的映射:
mappings dynamic: 'false' do
indexes :searchable, analyzer: "custom_index_analyzer", search_analyzer: "custom_search_analyzer"
indexes :year, type: "integer"
indexes :country_id, type: "integer"
indexes :region_id, type: "integer"
indexes :appellation_id, type: "integer"
indexes :category_id, type: "integer"
end
def as_indexed_json(options={})
as_json(
only: [:searchable, :year, :country_id, :region_id, :appellation_id, :category_id]
)
end
我试过这个:
query: {
filtered: {
query: {
match: {
searchable: search
}
},
filter: {
term: {
country_id: "1"
},
term: {
region_id: "2"
},
term: {
appellation_id: "34"
}
}
}
},
sort: {
_score: {
order: :desc
},
year: {
order: :desc,
ignore_unmapped: true
}
},
size:100
它运行良好但是在发送的appellation_id(34)中它将在所有情况下给出100个结果,即使可搜索的字段离文本搜索很远。
我也尝试过BOOL查询:
self.search(query: {
bool: {
must: [
{
match: {
country_id: "1"
},
match: {
region_id: "2"
},
match: {
appellation_id: "34"
},
match: {
searchable: search
}
}
]
}
},
sort: {
_score: {
order: :desc
},
year: {
order: :desc,
ignore_unmapped: true
}
},
size:100
)
但是它会给我所有与可搜索字段相匹配的结果,并且不会处理所需的appellation_id。
我的目标是获得最佳结果和性能,并要求ES向country_id = X,region_id = Y,appellation_id = Z提供所有数据,最后使用可搜索字段对这组结果进行匹配...并且不会通过可搜索的文本获得远离现实的结果。
感谢。
答案 0 :(得分:2)
您可能知道elasticsearch match
查询会根据relevance score返回结果。您可以尝试使用term
查询而非匹配来进行完全匹配。另外我猜你的bool查询结构必须如下:
bool: {
must: [
{ match: {
country_id: "1"
}},
{match: {
region_id: "2"
}},
{match: {
appellation_id: "34"
}},
{match: {
searchable: search
}}
]
}