【问题标题】:Sort Elasticsearch results based on field value根据字段值对 Elasticsearch 结果进行排序
【发布时间】:2017-08-31 23:18:55
【问题描述】:

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

    // user1 
    {
        "name": "John Bayes",
        "prog_langs": [
            {
                "name": "python",
                "score": 10
            },
            {
                "name": "java",
                "score": 500
            }
        ]
    }        



    // user2 
    {
        "name": "John Russel",
        "prog_langs": [
            {
                "name": "python",
                "score": 100
            },
            {
                "name": "PHP",
                "score": 200
            }
        ]
    }        



    // user3
    {
        "name": "Terry Guy",
        "prog_langs": [
            {
                "name": "C++",
                "score": 600
            },
            {
                "name": "Javascript",
                "score": 200
            }
        ]
    }

例如:搜索“John python” 应该返回 user1 和 user2,但 user2 首先出现


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

谢谢!


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

现在我只遗漏了具有多重匹配的全文搜索与当前查询合并的部分。

再次感谢!

【问题讨论】:

  • 那么,现在什么不起作用?你能分享你正在做的查询以及它们有什么问题吗?
  • 我将很快发布带有查询的编辑,但问题是,如果我直接查询 prog_langs,我现在只能根据匹配的查询进行排序。我的目标是,用户可以输入他想要的任何内容(我文档中的任何字段都是可搜索的),如果它是 prog_lang,我想按匹配的语言的分数对文档进行排序,而我最后的结果恰好是排序的以一种奇怪的方式(奇怪的是我认为不正确的结果)
  • 抱歉,我正在查看查询并决定尝试进行一些小的更改,我想我实现了我想要的。如果一切都按预期工作,将在这里为每个人发布查询!

标签: elasticsearch


【解决方案1】:

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

在发布我的解决方案之前,请记住以下几点:

  • 我创建了一个新映射,并添加了一些嵌套对象,因此我的原始查询不得不进行一些更改(prog_langs 现在是 nested 类型)
  • 我希望至少匹配两个字段,必须至少匹配一次

    {
        "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": {}
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2011-08-13
    • 2020-04-10
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多