给定具有标题、作者和描述的书籍索引,我希望以这种方式对结果搜索结果进行排序:

  • 与标题匹配的所有书籍,按下载量排序(数值)
  • 所有与作者匹配的书籍按下载排序
  • 所有与描述匹配的书籍,按下载排序

  • 我使用下面的搜索查询,但问题是每个条目都有不同的分数,因此按下载排序无关紧要。

    例如当搜索词是 'sorting' - title: 'sorting in elastic search' 的得分将高于 title: 'postgresql sorting is awesome'(因为词位置)。
    query = QueryBuilders.multiMatchQuery(queryString, "title^16", "author^8", "description^4")
    
    elasticClient.prepareSearch(Index)
          .setTypes(Book)
          .setQuery(query)
          .addSort(SortBuilders.scoreSort())
          .addSort(SortBuilders.fieldSort("downloads").order(SortOrder.DESC))
    

    我如何构建我的查询,以便获得所需的图书分类?

    我使用标准分析器,我需要对搜索查询进行分析,我还必须处理多词搜索查询字符串。

    谢谢。

    最佳答案

    您在这里需要的是一种基于三个加权字段和一个数字字段计算分数的方法。 Sort 将对从两者获得的分数求和,因此,如果其中一个太大,它将取代另一个。
    因此,更好的方法是使用匹配获得的分数进行多次下载。
    所以我会推荐功能得分查询 -

    {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query": "sorting",
              "fields": [
                "title^16",
                "author^8",
                "description^4"
              ]
            }
          },
          "function": [
            {
              "field_value_factor": {
                "field": "downloads"
              }
            }
          ],
          "boost_mode": "multiply"
        }
      }
    }
    

    这将根据所有三个字段计算分数。然后将该分数与下载字段中的值相乘以获得最终分数。乘法 boost_mode 决定函数计算的值如何与查询计算的分数组合在一起。

    关于sorting - 如何按分数+提升+字段对 Elasticsearch 结果进行排序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27702978/

    10-13 09:39