我正在尝试在 Elasticsearch 中实现自定义搜索。
问题陈述是考虑将 3 个文档插入到 Elasticsearch 中,其中“names”字段作为数组:
{
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 的文档应优先考虑。
最佳答案
在这种情况下,您可能需要修改/提高所需条件的搜索匹配结果的分数。例如,匹配名称为“Nick”
的文档,同时修改并提升包含names
以Nick
开头的文档的分数> 这样,匹配 Nick
并且以 Nick
开头的文档将具有更高的分数。
实现这一目标的方法之一是使用 Function Score Query. 在下面的查询中,对关键字“Nick”进行搜索,并使用 Match Phrase Prefix Query 修改和提升条件“以 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"
]
}
}
]
}
}
关于java - 在elasticsearch中实现优先级搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57000706/