根据字段值对Elasticsearch结果进行排序

时间:2017-08-31 23:18:56

标签: elasticsearch

假设我有3个文档(用户),并且他们具有多种编程语言的知识 - 如下所述,分数相关,我如何搜索多个字段(例如,多个匹配),以及是否有一些搜索关键字击中一种语言,按其分数排序?

vertical_layout

例如:搜索" John python" 应返回user1和user2,但user2首先显示

**我一直在尝试使用排序和功能,但我认为他们总是使用得分的最低/最高/平均值。

谢谢!

[编辑] **与此同时,我让它以测试方式工作,看看是否没有全文/多重匹配的作品,我发现我必须制作" prog_langs"嵌套,所以我改变了映射,它按预期工作。

现在我只缺少使用多重匹配的全文搜索与当前查询合并的部分。

再次感谢!

1 个答案:

答案 0 :(得分:0)

我设法修复了查询,现在它按预期工作了。

在发布我的解决方案之前,只需要记住一些事情:

  • 我制作了一个新的映射,并添加了一些嵌套对象,因此我的原始查询必须进行一些更改(prog_langs现在的类型为嵌套
  • 我希望至少有两个字段匹配,必须至少匹配一次
    {
        "query": {
            "bool": {
                "must": [
                    {
                        "query": {
                            "match": {
                                "name": {
                                    "query": "john python",
                                    "boost": 5
                                }
                            }
                        }
                    },
                    {
                        "bool": {
                            "should": [
                                {
                                    "nested": {
                                        "path": "prog_langs",
                                        "query": {
                                            "match": {
                                                "prog_langs.name": {
                                                    "query": "john python",
                                                    "boost": 5
                                                }
                                            }
                                        }
                                    }
                                }
                            ]
                        }
                    }
                ],
                "should": [
                    {
                        "function_score": {
                            "query": {
                                "match": {
                                    "prog_langs.name": "john python"
                                }
                            },
                            "functions": [
                                {
                                    "script_score": {
                                        "script": "_score * (1 + doc['prog_langs.score'].value)"
                                    }
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "highlight": {
            "fields": {
                "name": {},
                "prog_langs.name": {}
            }
        }
    }