我正在尝试在弹性搜索中实现自定义搜索。
问题语句考虑将3个文档插入到以“名称”字段为数组的弹性搜索中:
{
id:1,
names:["John Wick","Iron man"]
}
{
id:2,
names:["Wick Stone","Nick John"]
}
{
id:3,
names:["Manny Nick","Stone cold"]
}
当我搜索“ Nick”时,我想增强或优先使用以Nick开头的文档,因此在这种情况下,应先输入ID 2的文档,然后再输入ID 3的文档,并且如果我搜索全名“ Manny Nick” ” ID为3的文档应优先考虑。
答案 0 :(得分:0)
在这种情况下,您可能需要修改/提升搜索匹配结果的得分以符合所需条件。例如,匹配名称为"Nick"
的文档,同时修改并提高包含以names
开头的Nick
的文档的分数,以便匹配Nick
的文档并且以Nick
开头的得分。
其中一种方法是使用Function Score Query. 在以下查询中,搜索关键字“ Nick”,并使用{{3}修改并提高匹配文档的分数,以搜索条件 “以Nick开头的名称” },权重为20。
{
"query": {
"function_score": {
"query": {
"match": {
"names": "Nick"
}
},
"boost": "1",
"functions": [
{
"filter": {
"match_phrase_prefix": {
"names": "Nick"
}
},
"weight": 20
}
],
"boost_mode": "sum"
}
}
}
测试:
插入的数据:
{
id:1,
names:["John Wick","Iron man"]
}
{
id:2,
names:["Wick Stone","Nick John"]
}
{
id:3,
names:["Manny Nick","Stone cold"]
}
输出:
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 20.693148,
"hits": [
{
"_index": "stack_1",
"_type": "1",
"_id": "T9kn5WsBrk7qsVCmKBGH",
"_score": 20.693148,
"_source": {
"id": 2,
"names": [
"Wick Stone",
"Nick John"
]
}
},
{
"_index": "stack_1",
"_type": "1",
"_id": "Ttkm5WsBrk7qsVCm2RF_",
"_score": 20.287682,
"_source": {
"id": 3,
"names": [
"Manny Nick",
"Stone cold"
]
}
}
]
}
}